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