我有一个多项目构建,其中包含多个依赖于一个jar模块的war模块。
war和jar模块都依赖于Spring,Hibernate等库,这些依赖项在war模块上定义为provideCompile,在jar上定义为编译。
问题是当JetGradle更新依赖关系时,所有工件都有错误,因为工件需要jar模块的依赖关系。
我想使用以下任何解决方案:
另一方面,我的方法从一开始就完全错了。
war模块中的依赖关系定义为:
providedCompile 'org.slf4j:slf4j-log4j12:1.7.5'
providedCompile 'org.slf4j:jcl-over-slf4j:1.7.5'
...
compile(project(':jarModule')) {transitive = false}
...
jar模块中的依赖项定义为:
...
compile 'org.slf4j:slf4j-log4j12:1.7.5'
compile 'org.slf4j:jcl-over-slf4j:1.7.5'
...
答案 0 :(得分:22)
我找到的最佳解决方案是使用Gradle配置文件中的以下代码从jar模块设置传递“编译”依赖项:
apply plugin: 'idea'
configurations {
provided
provided.extendsFrom(compile)
}
idea {
module {
scopes.PROVIDED.plus += configurations.provided
}
}
对于Gradle 2.0 + ,将最后一位修改为:
idea {
module {
scopes.PROVIDED.plus += [configurations.provided]
}
}
此解决方案使用Intellij Gradle插件以及Gradle中的构思任务
我根据此网址上的信息运行此解决方案: https://github.com/Netflix/RxJava/pull/145 http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.idea.model.IdeaModule.html
我希望这有助于其他人
答案 1 :(得分:0)
我尝试了上述解决方案,但发现了一个问题。在我的场景中,我有一个具有上述配置的子项目。问题是子项目的传递依赖性没有在IntelliJ配置中导出,导致基础项目停止编译。
我做了一些挖掘,偶然发现了解决这个问题的小宝石。
/**
* Adds a configuration named 'provided'. 'Provided' dependencies
* are incoming compile dependencies that aren't outgoing
* dependencies. In other words, they have no effect on transitive
* dependency management.
*/
configurations {
provided
providedPlusCompile.extendsFrom(compile, provided)
testCompile.extendsFrom(providedPlusCompile)
}
sourceSets.main {
compileClasspath = configurations.providedPlusCompile
}
plugins.withType(IdeaPlugin) {
idea.module.scopes.PROVIDED.plus = [ configurations.provided ]
}
答案 2 :(得分:0)
添加Adrijardi的答案, Gadle 2.0 + 不仅我必须改变
scopes.PROVIDED.plus += configurations.provided
到
scopes.PROVIDED.plus += [configurations.provided]
我也不得不改变
provided project(":module-name") {
transitive = false
}
到
provided (project(":module-name")) {
transitive = false
}
请注意第二个代码示例中的额外括号