运行基础Cucumber测试用例出现java.lang.ExceptionInInitializerError如何解决
错误根源
该报错是Java 9及以上版本引入的模块系统强封装机制与旧版Cucumber依赖冲突导致:你使用的Cucumber 1.2.5属于已停止维护的老旧版本,其内部集成的XStream序列化库需要通过反射访问JDK内部java.util.TreeMap的私有字段,Java 9+默认禁止此类反射操作,因此抛出InaccessibleObjectException异常。
解决方案
以下方案优先级从高到低:
- 方案1:升级依赖到兼容高版本JDK的版本(优先推荐)
info.cukes组下的Cucumber早已停止官方维护,替换为io.cucumber组下的新版本依赖即可解决兼容问题,参考POM配置:
<dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>7.14.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <version>7.14.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.15.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency>
- 方案2:添加JVM启动参数绕过限制(适合暂时无法升级依赖的场景)
在测试运行的JVM参数中添加以下配置,开放对应JDK内部模块的反射权限:--add-opens java.base/java.util=ALL-UNNAMED
如果后续出现其他同类模块访问报错,可对应添加其他模块的开放配置。Eclipse环境配置路径:运行配置 -> 对应JUnit运行项 -> Arguments标签 -> VM arguments栏添加上述参数即可。 - 方案3:降级JDK版本到Java 8
Java 8无模块系统限制,旧版Cucumber 1.2.5可在JDK8环境下正常运行,无需修改任何代码和依赖配置。
内容的提问来源于stack exchange,提问作者user16943580
相关产品推荐
相关产品推荐

