【问题标题】:InaccessibleObjectException after migrating from Java 8 to Java 11从 Java 8 迁移到 Java 11 后出现 InaccessibleObjectException
【发布时间】:2020-03-01 23:10:06
【问题描述】:

我正在将一个相当大的单体 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).

我已经尝试过帖子How to solve InaccessibleObjectException ("Unable to make {member} accessible: module {A} does not 'opens {package}' to {B}") on Java 9? 中建议的解决方案。

但是使用参数 --add-opens java.base/jdk.internal.reflect=ALL-UNNAMED 作为 Maven 参数或将其存储在 maven jvm.config 中都没有帮助。

还有其他方法可以消除这些异常吗?

【问题讨论】:

  • 您使用的是哪个版本的 Spring Boot?
  • 我使用的是 Spring Boot 2.1.6 版
  • 该测试代码是否需要实际访问该模块?也许这可以通过稍微更改测试代码来解决。

标签: java maven spring-boot reflection migration


【解决方案1】:

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

<argLine>

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

如果您正在使用其他东西,或者其他一些与其他测试插件类似的标志。

请注意,您也可以通过完全不使用此内部 API 来解决其中一些问题,因此您应该先尝试一下。

【讨论】:

  • 非常感谢,我将 argline 添加到了 surefire 和故障安全插件中,现在它可以工作了 :-)
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 2019-09-20
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 2020-07-16
相关资源
最近更新 更多