Gradle 编译 Jar 中未包含的依赖项
Gradle compile dependencies not included in Jar
我有一个 jar,build-plugins.jar 带有一个 gradle 插件,在 build.gradle:
中用这个构建
apply plugin 'java'
dependencies {
compile gradleApi()
compile localGroovy()
compile('eviware:maven-soapui-plugin:4.5.1')
compile('org.antlr:stringtemplate:4.0.2')
compile('commons-io:commons-io:2.4')
compile('joda-time:joda-time:2.1')
}
这构建了 build-plugins.jar。而消费插件的项目通过file
引用插件jar
apply plugin 'thepluginwahoo'
buildscript {
dependencies {
classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:2.2.1'
classpath files('/path/to/build-plugins.jar')
}
}
问题是当我 运行 第二个项目的任何任务时,我得到 "class proxy could not be created for class xyz" 根本原因是四个依赖项(joda-time、commons-io、stringtemplate、maven -soapui-plugin) 不存在。如果我将依赖项添加到使用插件的项目中,那么它就可以正常工作:
apply plugin 'thepluginwahoo'
buildscript {
dependencies {
classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:2.2.1'
classpath files('/path/to/build-plugins.jar')
classpath 'eviware:maven-soapui-plugin:4.5.1'
classpath 'org.antlr:stringtemplate:4.0.2'
classpath 'joda-time:joda-time:2.1'
classpath 'commons-io:commons-io:2.4'
}
}
我的问题是为什么插件项目中的"compile"依赖项的类不出现在插件消费项目中,而jar包含在构建脚本的类路径中插件消耗项目。
Jar 通常不包含它们的依赖项。相反,它们与某种描述工件依赖关系的元数据描述符(pom.xml 或 ivy.xml)一起发布到存储库。当您直接将 jar 文件作为依赖项引用时,Gradle 无法知道它的传递依赖项是什么。你有几种方法来处理这个问题:
- 将您的插件 jar 连同必要的元数据(Gradle 将为您完成)发布到存储库,并将其作为 external module dependency
引入
- 使用 client module dependency.
显式声明插件的传递依赖项
- 使用 Gradle fatjar or shadow 插件之类的东西在你的 jar 中捆绑依赖项。
我有一个 jar,build-plugins.jar 带有一个 gradle 插件,在 build.gradle:
中用这个构建apply plugin 'java'
dependencies {
compile gradleApi()
compile localGroovy()
compile('eviware:maven-soapui-plugin:4.5.1')
compile('org.antlr:stringtemplate:4.0.2')
compile('commons-io:commons-io:2.4')
compile('joda-time:joda-time:2.1')
}
这构建了 build-plugins.jar。而消费插件的项目通过file
引用插件jarapply plugin 'thepluginwahoo'
buildscript {
dependencies {
classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:2.2.1'
classpath files('/path/to/build-plugins.jar')
}
}
问题是当我 运行 第二个项目的任何任务时,我得到 "class proxy could not be created for class xyz" 根本原因是四个依赖项(joda-time、commons-io、stringtemplate、maven -soapui-plugin) 不存在。如果我将依赖项添加到使用插件的项目中,那么它就可以正常工作:
apply plugin 'thepluginwahoo'
buildscript {
dependencies {
classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:2.2.1'
classpath files('/path/to/build-plugins.jar')
classpath 'eviware:maven-soapui-plugin:4.5.1'
classpath 'org.antlr:stringtemplate:4.0.2'
classpath 'joda-time:joda-time:2.1'
classpath 'commons-io:commons-io:2.4'
}
}
我的问题是为什么插件项目中的"compile"依赖项的类不出现在插件消费项目中,而jar包含在构建脚本的类路径中插件消耗项目。
Jar 通常不包含它们的依赖项。相反,它们与某种描述工件依赖关系的元数据描述符(pom.xml 或 ivy.xml)一起发布到存储库。当您直接将 jar 文件作为依赖项引用时,Gradle 无法知道它的传递依赖项是什么。你有几种方法来处理这个问题:
- 将您的插件 jar 连同必要的元数据(Gradle 将为您完成)发布到存储库,并将其作为 external module dependency 引入
- 使用 client module dependency. 显式声明插件的传递依赖项
- 使用 Gradle fatjar or shadow 插件之类的东西在你的 jar 中捆绑依赖项。