Gradle 7.4.2升级Java17时Groovy版本冲突问题咨询
问题根因
Gradle发行版内置的Groovy仅用于运行Gradle自身的构建逻辑,不会自动注入项目的编译、测试类路径。你看到的Groovy 2.5.13版本是第三方依赖传递引入到测试编译类路径的旧版本,和适配Groovy 3.0的Spock版本不兼容,和Gradle内置的Groovy版本没有关系。
修复步骤
- 第一步:显式引入Groovy插件,不要依赖隐式配置。在
build.gradle的plugins块中添加Groovy插件声明:
plugins { id 'java' id 'groovy' // 负责编译Groovy、Spock测试代码 }
- 第二步:在依赖块中显式声明和Spock版本匹配的Groovy依赖,同时排除Spock包内可能传递引入的Groovy,避免版本冲突:
sourceCompatibility = 17 dependencies { // 显式指定Groovy 3.0.9版本,和Spock 2.2-M1-groovy-3.0适配 testImplementation 'org.codehaus.groovy:groovy-all:3.0.9' testImplementation ('org.spockframework:spock-core:2.2-M1-groovy-3.0') { exclude group: 'org.codehaus.groovy' } testImplementation ('org.spockframework:spock-spring:2.2-M1-groovy-3.0') { exclude group: 'org.codehaus.groovy' } }
- 第三步:添加全局依赖版本强制规则,杜绝其他第三方依赖传递拉取旧版Groovy:
configurations.all { resolutionStrategy { // 所有Groovy相关依赖强制锁定3.0.9版本 force 'org.codehaus.groovy:groovy:3.0.9' force 'org.codehaus.groovy:groovy-all:3.0.9' force 'org.codehaus.groovy:groovy-xml:3.0.9' force 'org.codehaus.groovy:groovy-json:3.0.9' force 'org.codehaus.groovy:groovy-nio:3.0.9' force 'org.codehaus.groovy:groovy-macro:3.0.9' } }
- 第四步:清理旧缓存避免历史文件干扰,依次执行以下命令:
# 停止所有残留的Gradle守护进程 ./gradlew --stop # 清理项目本地构建产物 ./gradlew clean
如果执行完上述配置后仍然报Groovy版本错误,手动删除本地Gradle缓存中的旧版Groovy包即可:
rm -rf ~/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy/2.5.13
- 第五步:重新执行构建验证
./gradlew clean test --no-daemon
验证方法
如果需要确认类路径下的Groovy版本是否正确,执行以下命令查看测试编译类路径的依赖树:
./gradlew dependencies --configuration testCompileClasspath | grep groovy
输出中所有Groovy相关依赖版本均为3.0.9即为配置正确。
内容的提问来源于stack exchange,提问作者kniffte
相关产品推荐
相关产品推荐

