基于gradle:6.9.1-jdk11-hotspot构建Java项目出现间歇性编译错误咨询
触发原因
- JDK 9 引入的模块系统中,
javax.xml.stream相关类归属java.xml标准模块,默认对未命名模块开放。你项目中使用的io.freefair.aspectj.compile-time-weaving:3.8.4插件版本对 JDK 11 模块路径适配存在缺陷,构建过程中偶发时序问题,会误将java.xml模块从编译可见范围排除,导致类不可访问报错。 - 3.x 版本的 aspectj 编译织入插件与 Gradle 6.9.1 适配不稳定,容器环境下资源调度的波动会放大这个加载缺陷,因此报错为间歇性,重试时插件加载路径正常就可以构建成功。
可行解决方案
方案1:升级aspectj编译织入插件(最彻底)
将 io.freefair.aspectj.compile-time-weaving 插件升级到适配 Gradle 6.x 的最新稳定版 6.6.3,该版本已经修复了 JDK 模块路径间歇性加载异常的问题。
方案2:强制声明模块可见性
在 build.gradle 中分别给编译任务和 aspectj 织入任务添加模块开放参数,强制暴露 javax.xml.stream 包:
// Java编译任务添加参数 compileJava { options.compilerArgs += ['--add-modules', 'java.xml', '--add-exports', 'java.xml/javax.xml.stream=ALL-UNNAMED'] } // AspectJ织入任务添加参数 aspectj { ajc.args = ['--add-modules', 'java.xml', '--add-exports', 'java.xml/javax.xml.stream=ALL-UNNAMED'] }
方案3:显式引入stax-api兼容包
不需要调整模块参数,直接在项目依赖中引入独立的stax-api包,绕开JDK模块系统的限制:
implementation 'javax.xml.stream:stax-api:1.0-2'
方案4:Docker构建层面优化
在Dockerfile的Gradle执行命令中添加JVM参数,避免资源不足触发的类加载异常:
RUN gradle --stacktrace --no-daemon :common:build -Dorg.gradle.jvmargs="-Xmx2g --add-modules java.xml"
内容的提问来源于stack exchange,提问作者Baskar
相关产品推荐
相关产品推荐

