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
相关产品推荐
相关产品推荐

