module java.base does not "opens java.lang" to module

4 篇文章 0 订阅
3 篇文章 0 订阅

1、Java9开始的JDK支持模块化,如果模块A引用模块B,模块A的module-info.java:
moudle A {
    requires B;
}
但模块B并未加入module-info.java达成模块化,或者未开放外部所需部分,那么就会产生“Unable to make {member} accessible: module {模块A或模块A中的一部分} does not 'opens {部分包}' to {模块B}

2、解决方案为在VM options中加入:
--add-opens has the following syntax: {模块A或模块A中的一部分}/{部分包}={B}

3、举例:报module java.base does not "opens java.lang" to module hao.test.api
在VM options中加入--add-opens java.base/java.lang=hao.test.api即可。
IDEA可以在Run-Edit Configurations-VM options中加入--add-opens java.base/java.lang=hao.test.api。
如果命令行运行,如通过cmd或者bat,在java命令后,空格,加入--add-opens java.base/java.lang=hao.test.api。

如果有多个模块化引用缺失,可以:
--add-opens java.base/java.lang=hao.test.api
--add-opens jdk.internal/java.lang=hao.test.api
或者--add-opens java.base,jdk.internal/java.lang=hao.test.api (未测试过,有朋友遇到可以将测试结果评论告诉博主)

{模块A或模块A中的一部分}、{部分包}、{模块B}都是集合,可以多个一起。

4、如果需加入的过多,可以使用--permit-illegal-access,会使用封装终止开关 - 允许非法访问。它将允许类路径上的所有代码反映所有命名模块。请注意,此标志仅适用于Java 9 !

5、(1)如果报module A does not export A的一部分 to module B,在A的module-info.java中加入exports A的一部分 to B即可。
(2)本文参考自StackOverflow的热心国外网友(附上链接:https://stackoverflow.com/questions/41265266/how-to-solve-inaccessibleobjectexception-unable-to-make-member-accessible-m),强烈推荐StackOverflow,如果CSDN、博客园、开源中国、简书都没有相关内容,你也不想在源码和官方文档中刨,那么StackOverflow是一个不错的选择。
(3)博主看完StackOverflow后,发现IT屋居然有篇翻译,为什么没早看到,附上链接:http://www.it1352.com/957980.html

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
### 回答1: 这个错误是因为Java 9及以上版本引入了模块化系统,而在模块化系统中,Java.lang包默认是对所有模块开放的,但是在这个错误中,Java.base模块没有将Java.lang包开放给未命名模块。这可能是因为您的代码中使用了Java 9及以上版本的特性,但是您的代码没有被编译为模块化的形式。要解决这个问题,您可以将您的代码编译为模块化的形式,或者在启动Java虚拟机时使用--add-opens选项将Java.lang包开放给未命名模块。 ### 回答2: 在Java 9中,引入了一个新的特性“模块化系统”,旨在解决Java应用程序之间依赖冲突的问题。模块是代码和资源的封装单元,可以明确定义导出和开放的包,以此来限制对其他模块的访问。 但是,在使用模块化系统时,我们可能会遇到以下错误信息:“module java.base does not 'opens java.lang' to unnamed module”,即Java基本模块不向未命名模块开放java.lang包。这个错误会发生在某些情况下,例如当我们使用反射机制或某些第三方库时,这些操作需要访问受限的包或类时。 问题的原因是Java基本模块(java.base)默认情况下仅向它使用的其他模块开放java.lang包,但未命名模块却无法访问它。未命名模块是指没有显式声明模块名称的类路径上的类集合。 解决这个问题的方法是显式地将java.lang包开放给我们使用的未命名模块。这可以在模块描述符(module-info.java)中添加以下声明来实现: open module mymodule { // ... opens java.lang; } 这里的mymodule是我们自己的模块名称,我们可以更改它以适应我们的应用程序模块描述符。 添加声明后,我们就可以使用反射机制或其他需要访问java.lang包的操作而不会遇到以上错误信息。 总的来说,在使用Java 9及更高版本的Java时遇到“module java.base does not 'opens java.lang' to unnamed module”问题是常见的,这是由于模块化系统的限制导致的。在解决此问题时,我们应该加强对模块描述符的理解,以便有针对性地进行干预。 ### 回答3: 这个错误信息的意思是java.base模块没有为未命名模块打开java.lang模块。在Java 9中,引入了模块系统,以避免类之间的冲突和不必要的类路径干扰。模块化应用程序将更易于管理和维护,模块之间的依赖性可以更清楚地表示。但是,这也带来了新的挑战。在模块化环境中,所有的Java代码都必须被分配到一个模块中,并且每个模块都必须声明其依赖项。 在这里,错误消息告诉我们java.base模块不会“打开”(也就是允许一个模块访问另一个模块的内部)java.lang模块。在Java 9中,java.lang模块被认为是可观察模块,并且它是自动打开的。但是,如果你在代码中使用反射或Hessian等技术访问java.lang包(例如通过分解字符串名称来实现),那么你需要显式地打开它。 为了解决这个问题,可以使用以下命令来打开java.lang模块: ``` --add-opens java.base/java.lang=ALL-UNNAMED ``` 这个命令不是在代码中使用的,而是在Java命令行中使用的。它告诉Java虚拟机打开java.base模块中的java.lang模块,并允许所有未命名模块访问它。如果你使用的是build tools,如Maven和Gradle,你可以在构建配置文件中添加这个命令。 总之,这个错误消息的原因是因为java.lang模块没有被打开到未命名模块,可以通过使用上述命令来解决。在实践中,了解模块化系统如何工作以及如何处理这些错误消息是非常重要的,以确保你的应用程序在Java 9及以上版本中能够正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃峰顶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值