Minor Gradle升级会中断测试编译

时间:2018-01-22 14:05:47

标签: gradle groovy

我想逐步升级Gradle包装器以提高构建速度。从2.3移动到2.4后,测试编译失败并出现public class DtoUser { public int UID { get; set; } public string FName { get; set; } public DateTime Birthdate { get; set; } public int CityID { get; set; } public int UserTypeID { get; set; } } 错误,我正在努力解决依赖问题。

考虑这个Spock测试:

incompatible types

这个Java类:

class DetailsSortKeySpec extends Specification {
    def 'Simple Test'() {
        given:
        TestDetailsSortKey testDetailsSortKey = new TestDetailsSortKey(details, collationKey)

        expect:
        testDetailsSortKey.details.equals(details)

        where:
        details                | collationKey
        new TestDetails(id: 0) | Collator.getInstance(Locale.ENGLISH).getCollationKey('')
    }

    private class TestDetailsSortKey extends DetailsSortKey<TestDetails> {
        TestDetailsSortKey(TestDetails details, CollationKey collationKey) {
            super(details, collationKey)
        }
    }
}

运行public class DetailsSortKey<T extends Details> { private final T details; private final CollationKey collationKey; public DetailsSortKey(final T details, final CollationKey collationKey) { this.details = details; this.collationKey = Objects.requireNonNull(collationKey); } public final T getDetails() { return details; } } 时出现以下错误消息:

compileTestGroovy

Release Notes没有列出任何似乎对此负责的问题,所以我挖掘了可能是根本原因的Groovy问题,并且真正发现了issue about Generics。但该错误应该已经修复。我不明白尝试将/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. 转换为Details的地点和原因,这只是TestDetails类的一个简单而空洞的派生。

这些是Gradle发行版中使用的Groovy版本:

Gradle 2.3 :Groovy:2.3.9

Gradle 2.4 :Groovy 2.3.10

对我而言,这看起来与引用的Groovy错误完全相同,但是应该从2.3.8开始修复,并且不应该影响此构建。此外,依赖项在项目中声明为:

Details

两个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" } 的输出之间的差异只包含工具,这些工具在发行说明中提到但不属于测试范围。

最终,这里使用了哪个Groovy版本?

2 个答案:

答案 0 :(得分:1)

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'
    }
}

答案 1 :(得分:1)

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

例如:

configurations {
    groovy
}
dependencies {
    groovy 'org.codehaus.groovy:groovy-all:2.4.11'
    compile 'org.codehaus.groovy:groovy-all:2.4.11'
    testCompile('org.spockframework:spock-core:1.0-groovy-2.4') {
        exclude module: 'groovy-all'
    }
}
compileGroovy {
    groovyClasspath = configurations.groovy
}

*编辑*

要查看正在挑选的版本(由于依赖性解析),您可以

gradle dependencies

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

gradle xxx:dependencies

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

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

请参阅ResolutionStrategy