这个问题对我来说似乎是一个真正的谜。我们正在开发一个 Spring REST 应用程序。在我的团队中,我们让 Jenkins 在所有 checkin (CI 构建)上运行构建。此外,还有一个官方版本,每晚都在 elsehwere 完成。一些集成测试最近在 CI 构建期间开始失败,我们追踪了 jar 冲突的原因。但是,我们之前已经成功排除了导致这些冲突的传递依赖,对于官方构建和团队中的一些开发人员来说,这仍然是正确的。对于其他人来说,它不再是。
我们有相同的代码库和相同的 Gradle 文件。当我在我的系统上运行依赖任务时,我在一个子项目中有一棵传递依赖的长树(就像 Jenkins 机器一样),而其他的则没有这样的树。此外,对于某些开发人员而言,WAR 的大小比其他开发人员大几个数量级。传递依赖来自另一个上传到 Nexus 的相关项目。
我已经刷新了我的机器和 Jenkins 机器上的依赖关系,甚至清除了 .gradle,但无济于事。
这听起来像是环境问题,但 Gradle 版本和 Java 版本大致相同,最多有几个小版本。
关于什么可能导致这种差异的任何想法?
最佳答案
您可以强制您的依赖项全面适用于特定版本
def gsonModule = 'com.google.code.gson:gson'
configurations.all {
resolutionStrategy {
// add dependency substitution rules
dependencySubstitution {
substitute module(gsonModule) with module("$gsonModule:2.6.1")
}
}
}
// note: configurations block must be above the dependencies
// or build will error
dependencies {
compile "$gsonModule:2.7"
}
然后,当任何开发人员/CI/test/CD 运行构建时,您的
resolutionStrategy
强制所有编译的一致性。 gradle 中的默认行为是在版本冲突时使用较新的版本。这将强制所有版本相同,无论其声明的版本如何。$ ./gradlew dependencies --configuration compile -q
------------------------------------------------------------
Root project
------------------------------------------------------------
compile - Dependencies for source set 'main'.
\--- com.google.code.gson:gson:2.7 -> 2.6.1
引用:https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html
关于gradle - 相同的 Gradle 文件,相同的代码库,不同开发人员的不同依赖关系图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41219121/