JDK11迁移时Gradle构建报NoClassDefFoundError问题求助
问题排查与解决办法
这个问题我之前帮不少开发者排查过,核心原因是Groovy自带的groovy.xml.jaxb.JaxbGroovyMethods类依赖JAXB API,而JDK11彻底移除了JDK内置的JAXB模块。虽然你已经添加了第三方JAXB依赖,但还有几个关键配置遗漏了:
1. 升级Groovy到兼容JDK11的版本
旧版本的Groovy(比如2.4.x及更早)对JDK9+的模块系统适配很差,完全没考虑JAXB被移除的情况。你得把Groovy升级到2.5.x及以上的稳定版,新版本的Groovy已经做了适配,会自动识别你引入的第三方JAXB库,而不是硬依赖JDK内置的模块。
2. 补全JAXB相关的完整依赖
你漏了一个关键依赖:javax.activation:javax.activation-api,JAXB底层依赖这个组件,而JDK11也把它移除了。另外建议把JAXB版本升级到2.3.1(比2.3.0兼容性更好),完整的依赖配置应该是这样的:
dependencies { implementation 'javax.xml.bind:jaxb-api:2.3.1' implementation 'com.sun.xml.bind:jaxb-impl:2.3.1' implementation 'com.sun.xml.bind:jaxb-core:2.3.0' implementation 'javax.activation:javax.activation-api:1.2.0' // 这个是你漏掉的核心依赖 }
如果你的构建脚本本身也用到了Groovy的JAXB方法,记得在buildscript的dependencies里也加上这些依赖。
3. 移除旧的JDK模块参数
既然已经切换到第三方JAXB依赖,之前在JavaCompile里加的--add-modules参数就没必要留着了,反而可能和第三方依赖冲突,记得删掉:
tasks.withType(JavaCompile) { options.compilerArgs.removeAll { it.startsWith('--add-modules=java.xml.bind') } }
最后验证
做完上面的配置后,先清理旧的构建缓存再重新构建:
./gradlew clean build
这样应该就能解决NoClassDefFoundError的问题了。
内容的提问来源于stack exchange,提问作者neu242
相关产品推荐
相关产品推荐

