
在使用jdk17启动CMAK3.0.0.5/3.0.06版本时,页面显示异常,报如下错误信息: Caused by: java.lang.IllegalAccessError: class play.utils.Resources$ (in unnamed module @0x388ffbc2) cannot access class sun.net.www.protocol.file.FileURLConnection (in module java.base) because module java.base does not export sun.net.www.protocol.file to unnamed module
报错信息指出了问题是无法访问sun.net.www.protocol.file.FileURLConnection类,java.base模块未设置该类所在包对所有未命名模块的访问 如此以来问题就定位在java.base的声明上
参数说明: –add-opens是Java 9及更高版本中引入的一个JVM启动参数,用于在Java模块化系统中开放特定模块的访问权限。这允许其他模块通过反射访问原本由于模块化限制而不可访问的类、方法或字段。 java.base: Java平台的核心模块,包含了Java语言的基础类。 基本语法
--add-opens <module>/<package>=<target-module> 使用示例
--add-opens java.base/java.lang=ALL-UNNAMED ALL-UNNAMED: 表示对所有未命名模块开放访问权限。未命名模块是指那些在模块路径(module-path)上但没有声明模块的JAR文件。
--add-opens java.base/java.lang=spring.core spring.core: 对Spring框架开放
通过jvm add-opens参数来声明,示例如下
#要添加的参数
--add-opens java.base/sun.net.www.protocol.file=ALL-UNNAMED完整的java启动命令示例如下(多个包需要放开访问示例)
java --add-opens java.base/sun.net.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/sun.net.www.protocol.file=ALL-UNNAMED -Duser.dir=/data -cp xxx.jar xxx如下内容仅为参考======================
自从 Java 9 引入模块化(即 Jigsaw 项目)后,为了增强安全性和封装性,模块不再像以前那样允许任意访问所有模块和包中的内容。Java 模块机制通过模块之间的依赖和导出规则来限制访问,具体体现在以下两点:
语法
--add-opens <模块名称>/<包名称>=<目标模块> 示例
假设我们要启动一个程序,运行时需要向一个未命名模块(类路径下的代码)开放模块 java.base 的 java.lang.reflect 包:
java --add-opens java.base/java.lang.reflect=ALL-UNNAMED -jar app.jar 含义:
使用场景
注意事项
常见错误
错误提示通常是:
java.lang.reflect.InaccessibleObjectException: Unable to make private method accessible: 和 --add-exports 的区别
–add-opens 和 --add-exports 都是解决 Java 模块化带来的访问限制的参数,但区别在于:
总结
–add-opens 用于在运行时允许外部模块通过反射访问指定模块的某个包,它更像是一种临时性补救措施,主要用于解决 Java 9+ 模块化带来的兼容性问题,