Gradle 小梯度升级中断了测试编译

Gradle 小梯度升级中断了测试编译,gradle,groovy,Gradle,Groovy,我想增量升级Gradle包装器,以提高构建速度。在从2.3迁移到2.4之后,测试编译失败,出现了不兼容类型错误,我正在与依赖项作斗争 考虑一下斯波克测试: class DetailsSortKeySpec扩展了规范{ def“简单测试”(){ 鉴于: TestDetailsOrtKey TestDetailsOrtKey=新的TestDetailsOrtKey(详细信息,排序键) 期望: TestDetailsOrtKey.details.equals(详细信息) 哪里: 详细信息|排序键 新的

我想增量升级Gradle包装器,以提高构建速度。在从2.3迁移到2.4之后,测试编译失败,出现了
不兼容类型
错误,我正在与依赖项作斗争

考虑一下斯波克测试:

class DetailsSortKeySpec扩展了规范{
def“简单测试”(){
鉴于:
TestDetailsOrtKey TestDetailsOrtKey=新的TestDetailsOrtKey(详细信息,排序键)
期望:
TestDetailsOrtKey.details.equals(详细信息)
哪里:
详细信息|排序键
新的TestDetails(id:0)| Collator.getInstance(Locale.ENGLISH).getCollationKey(“”)
}
私有类TestDetailsOrtKey扩展了DetailsOrtKey{
TestDetailsSortKey(TestDetails详细信息,CollationKey CollationKey){
超级(详细信息,排序规则键)
}
}
}
这个Java类:

公共类详细信息ssortkey{
私人最终T详细信息;
私有最终排序规则密钥排序规则密钥;
public DetailsSortKey(final T details,final CollationKey CollationKey){
this.details=详细信息;
this.collationKey=Objects.requirennull(collationKey);
}
公开的最终信息{
退货详情;
}
}
运行
compileTestGroovy
时出现以下错误消息:

/var/lib/jenkins/workspace/gradle_upgrade/build/tmp/compileTestGroovy/groovy-java-stubs/com/vendor/transfer/sorting/DetailsSortKeySpec.java:25: error: incompatible types: Details cannot be converted to TestDetails
super ((com.vendor.common.transfer.Details)null, (java.text.CollationKey)null);
       ^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
startup failed:
Compilation failed; see the compiler error output for details.

1 error

 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':WEB-Commons:compileTestGroovy'.
> Compilation failed; see the compiler error output for details.
没有列出任何与此相关的问题,因此我深入研究了Groovy中可能是根本原因的问题,并找到了一个解决方案。但是这个bug应该已经被修复了。我不明白在哪里以及为什么会有人试图将
Details
转换为
TestDetails
,这只是
Details
类的简单而空洞的派生

以下是Gradle发行版中使用的Groovy版本:

渐变2.3:Groovy:2.3.9

渐变2.4:Groovy 2.3.10

对我来说,这似乎与引用的Groovy bug完全相同,但该bug应该在2.3.8版之后修复,并且不应该影响此构建。此外,项目中的依赖关系声明如下:

dependencies {
    // mandatory dependencies for using Spock
    compile "org.codehaus.groovy:groovy-all:2.4.11"
    testCompile "org.spockframework:spock-core:1.1-groovy-2.4"
}
两个
gradlew:dependencies
的输出之间的差异仅包含发行说明中提到但不属于测试范围的工具


最后,这里使用的是哪个Groovy版本?

Spock对
Groovy all
具有可传递的依赖关系,这可能与您声明的
Groovy all
版本冲突。另外,您没有使用Gradle版本的
groovy all
(您正在声明此版本的另一个版本)。我以不同的方式声明这两个依赖项,如下所示:

dependencies {
    compile localGroovy()
    testCompile('org.spockframework:spock-core:1.0-groovy-2.4') {
        exclude module: 'groovy-all'
    }
}

我认为您希望使用与Gradle捆绑的版本不同的Groovy版本进行编译。看

例如:

*编辑*

要查看选择的版本(由于依赖项解析),您可以

或(其中xxx为子项目名称)

要强制使用特定的依赖项版本,可以

gradle dependencies
configurations.all {
    resolutionStrategy {
        force 'org.codehaus.groovy:groovy-all:2.4.11'
    }   
}

请参见

,因为这些依赖关系根本没有改变,我怀疑这会有任何影响。此外,参考捆绑的Groovy发行版并不总是一个好主意,是吗?Spock-for-Groovy-2.4可能会面对Groovy 2.3并崩溃,这取决于您对“捆绑Groovy发行版”的区分,捆绑Spock?还是和Gradle捆绑在一起?我使用的是与Gradle捆绑在一起的版本当Gradle附带Groovy 1.9或3.1时会发生什么?这就是我的意思,参考捆绑版不是一个好主意。您想使用与依赖项一起工作的特定版本,对吗?我一直想使用与gradle捆绑的groovy版本,因为我只在groovy中编写gradle插件或spock测试。其他一切都是java,我从不将Groovy代码部署到生产环境中。请参阅我的另一个答案,即使用您自己的Groovy版本进行编译谢谢,但是我只能在配置阶段使用这些语句,因为编译错误-然后输出绑定的Groovy版本。无法执行测试中的任何代码。还有其他想法吗?那没用。这样我就可以强迫它使用Groovy 2.3,它实际上是与Gradle捆绑在一起的。它因版本不匹配错误而中断。这证明我的尝试使用的不是捆绑的Groovy,而是我引用的Groovy。问题是-为什么它仍然中断?也许您有另一个依赖项引入了
groovy all
依赖项。尝试
gradle dependencies
(或子项目的
gradle xxx:dependencies
)查看发生了什么。您可能需要强制执行该版本(请参阅我的更新),这就是为什么我不知道这里发生了什么。一种巫术。。。但是Groovy没有明显改变,Gradle版本之间也没有任何改变,这会干扰我的测试。。。无论如何,由于这似乎是某种巫术,我接受你的回答,因为它提供了有用的策略。
gradle xxx:dependencies
configurations.all {
    resolutionStrategy {
        force 'org.codehaus.groovy:groovy-all:2.4.11'
    }   
}