You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java8迁移至Java17时Maven编译测试类报R1549aadb错误咨询

问题对应解决方案与错误码说明

R1549aadb是OpenJDK 17版本javac编译器在模块系统校验逻辑里的内部错误标记,不属于对外公开的标准错误码,触发场景和你描述的完全匹配:存在module-info.java的模块化项目编译测试代码时,类路径/模块路径配置不符合JPMS(Java平台模块系统)规范,编译器扫描import语句对应的包时找不到可访问的模块条目,就会抛出cannot access [包名首段]的报错,你碰到的org/java/javax前缀报错都是这个逻辑触发的。

触发原因

  • 项目做模块化改造后存在非模块化依赖,这类依赖会被归到未命名模块(UNNAMED MODULE),默认不会被你定义的显式模块读取
  • Eclipse自带的Java编译器对测试代码做了模块化宽松兼容,绕过了javac的严格校验,所以不通过Maven启动时可以正常编译运行
  • 低版本的Maven编译插件对Java 17+的JPMS测试编译支持有缺陷,编译主代码时路径配置正常,编译测试代码时没有默认开放未命名模块的读取权限,就会触发该错误。

修复步骤

  • 升级maven-compiler-plugin到3.11.0及以上版本,在配置中添加测试编译的模块读取参数,开放所有未命名模块的访问权限:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <source>17</source>
        <target>17</target>
        <testCompilerArgument>--add-reads ${project.artifactId}=ALL-UNNAMED</testCompilerArgument>
    </configuration>
</plugin>
  • 升级maven-surefire-plugin到3.0.0及以上版本,低版本插件在Java 17模块化场景下会篡改测试类路径,触发编译、运行异常:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.1.2</version>
</plugin>
  • 若仍有个别测试依赖报同类错误,在module-info.java中对测试依赖添加static修饰的依赖声明,该类声明仅在编译、运行测试阶段生效,不会影响主代码的模块封装:
open module 你的项目模块名 {
    // 此处保留原有主代码的依赖声明
    // 测试依赖示例
    requires static org.junit.jupiter.api;
}

该问题属于Java 17迁移模块化过程中的常见踩坑点,核心原因是Maven官方插件早期对JPMS的适配滞后,不是业务代码逻辑问题。

内容的提问来源于stack exchange,提问作者cdc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:03:39