我正在将一个相当大的monolith spring引导应用程序从Java 8迁移到Java 11。在修复了已删除的JEE模块之后,基于新引入的模块系统概念的强大封装,我遇到了几个反射错误。
但是,使用Java 11启动应用程序,通过Maven执行干净的安装不起作用。由于反射和强封装,InaccessibleObjectException会导致多个测试失败。
java.lang.reflect.InaccessibleObjectException: Unable to make field private jdk.internal.reflect.MethodAccessorImpl jdk.internal.reflect.DelegatingMethodAccessorImpl.delegate accessible: module java.base does not "opens jdk.internal.reflect" to unnamed module @6a969fb8 at com......(some Test-Method).
我已经尝试过在那篇文章How to solve InaccessibleObjectException ("Unable to make {member} accessible: module {A} does not 'opens {package}' to {B}") on Java 9?中提出的解决方案。
但是,无论是使用参数java.base/jdk.internal.reflect=ALL-UNNAMED --add--作为Maven参数,还是将其存储在maven jvm.config中都没有帮助。
还有其他方法来消除这些例外吗?
发布于 2019-11-06 14:31:10
您应该将这些标志添加到maven本身,而是添加到您的测试配置中,因为测试可能运行在单独的jvm:http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html中。
<argLine>要在命令行上设置的
任意JVM选项。用户属性为:
argLine。
或者与其他测试插件类似的标志,如果您使用的是其他的东西。
请注意,您可能还可以通过根本不使用这个内部API来修复其中的一些问题,所以您应该先尝试一下。
https://stackoverflow.com/questions/58713686
复制相似问题