Java11迁移至Java17测试遇模块访问权限问题求助
解决Java 17迁移中Flink Kryo序列化的模块访问问题
问题根源
你遇到的错误是Java 17模块系统限制了反射访问导致的:java.util.Arrays$ArrayList的私有字段a需要被反射读取,但java.base模块未将java.util包开放给未命名模块(unnamed module)。你之前使用的--add-opens java.lang/java.util=ALL-UNNAMED参数存在模块路径错误——java.util属于java.base模块,而非java.lang模块。
正确解决方案
1. 修正JVM参数
使用正确的--add-opens参数开放java.base模块下的java.util包:
--add-opens java.base/java.util=ALL-UNNAMED
2. 在构建工具中配置参数
如果通过Maven或Gradle运行测试,需将参数配置到对应测试插件中:
- Maven(Surefire插件):
在pom.xml的build/plugins节点添加:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>--add-opens java.base/java.util=ALL-UNNAMED</argLine> </configuration> </plugin> - Gradle:
在build.gradle的test任务中添加:test { jvmArgs '--add-opens', 'java.base/java.util=ALL-UNNAMED' }
3. 验证效果
重新运行测试,该参数会让java.base模块将java.util包的反射权限开放给所有未命名模块,解决ArraysAsListSerializer的反射访问问题。
内容的提问来源于stack exchange,提问作者Thomás Preis
相关产品推荐
相关产品推荐

