从Java 8迁移到Java 11后出现不可访问的ObjectException



我正在将一个相当大的单块spring-boot应用程序从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).

我已经尝试了那篇文章中建议的解决方案。如何在Java 9上解决InaccessibleObjectException("无法使{member}可访问:模块{A}无法打开{package}到{B}"(?。

但是,使用参数--add既不能打开java.base/jdk.internal.reflect=ALL-UNNAMED作为Maven参数,也不能将其存储在Maven jvm.config中。

有没有其他方法可以消除这些例外?

您不应该将这些标志添加到maven本身,而是添加到您的测试配置中,因为测试可能在单独的jvm中运行:http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html

<argLine>

要在命令行上设置的任意JVM选项。用户属性为:argLine

或者其他类似于其他测试插件的标志(如果您正在使用其他东西(。

请注意,您也可以通过根本不使用此内部API来修复其中的一些问题,因此您应该先尝试一下。

最新更新