我想逐步升级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版本?
答案 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'
}
}