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

Java 16.0.1环境执行Maven命令出现Cucumber反射异常如何解决?

问题原因

Java 9起引入的JPMS模块化系统对反射访问做了严格限制,默认禁止外部模块通过反射强制访问JDK内部的非公开属性、方法。你当前使用的Cucumber版本较低,底层依赖的反射逻辑会强制访问java.util.TreeMap的私有comparator字段,Java 8无模块化限制所以运行正常,升级到Java 16后这种非法访问直接被拦截,抛出对应异常。
Eclipse运行正常是因为其默认会自动给JVM添加--add-opens系列参数开放JDK内部模块的访问权限,而Maven默认没有配置对应参数,因此出现两边运行结果不一致的情况。

解决方案

提供两种可落地的处理方案:

方案一:升级Cucumber到兼容高版本JDK的版本(推荐)

直接将项目中Cucumber相关依赖升级到7.0及以上版本,该版本及后续迭代已经完成了Java 9+模块化规则的适配,不需要额外配置即可正常运行,从根源解决非法反射访问的问题。

方案二:配置Maven测试插件的JVM参数

如果当前项目架构限制无法升级Cucumber版本,可以临时开放java.util包的访问权限,步骤如下:

  • 找到项目根目录的pom.xml文件,定位到maven-surefire-plugin(负责单元测试执行)和maven-failsafe-plugin(负责集成测试执行)的配置节点
  • 在两个插件的configuration配置段中新增argLine属性,配置示例如下:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>和当前Maven版本匹配即可</version>
    <configuration>
        <argLine>--add-opens java.base/java.util=ALL-UNNAMED</argLine>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>和surefire版本保持一致即可</version>
    <configuration>
        <argLine>--add-opens java.base/java.util=ALL-UNNAMED</argLine>
    </configuration>
</plugin>

配置完成后重新执行mvn verify命令即可正常运行测试套件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 21:06:05