在软件进行maven编译时候会遇到java.lang.reflect.InaccessibleObjectException: Unable to make final void java.lang.Throwable.setCause(java.lang.Throwable) accessible: module java.base does not "opens java.lang" to unnamed module是Java 9及以上版本模块化系统(Jigsaw Project)引入的一个安全特性导致的。自Java 9起,核心类库被组织成模块,并且默认情况下对非模块化的代码(unnamed module)提供了封装保护。
解决:
1. 切换到java 1.8(java 8 )以下 或者在maven中禁止使用test
2. 模块化应用并且禁用模块系统的反射限制
- 请在你的模块声明文件(module-info.java)中添加需要访问
java.lang.Throwable.setCause
方法的opens语句。
module your.module.name {
requires transitive java.base;
opens your.package.to.open to java.base; // 如果是在你的包内调用
opens java.lang to your.module.name; // 如果要在你的模块内访问java.lang.Throwable
}
- 禁用模块系统的反射限制
在启动Java应用程序时,可以通过命令行参数--add-opens java.base/java.lang=ALL-UNNAMED
临时关闭特定模块的反射限制。但这不是一个推荐的长期解决方案,因为它降低了安全性并可能引起其他问题。