我正在尝试修复使用Java 17运行时运行Nexus IQ扫描仪的问题。
错误是
数组;InaccessibleObjectException:无法使受保护的最终java.lang. class java.lang. classloader . defineclass (java.lang. string,byte[],int,int,java.security. protectiondomain)抛出java.lang. classformaterror可访问:模块java。Base不"打开java.lang";给未命名模块@7225790e
所以我尝试将--add-opens java.base/java.lang=ALL-UNNAMED
的修复传递给运行nexus-iq-cli.jar
的JVM。
不幸的是,我没有完全控制在CI上执行的java -jar ...
命令,否则我只会显式传递--add-opens java.base/java.lang=ALL-UNNAMED
。由于这个限制,我尝试使用一些其他方法来设置全局JVM参数设置。我想到的一种方法是使用_JAVA_OPTIONS
环境变量。
让我惊讶的是Java退出了一个错误:
无法识别的选项:——add- opened
当我尝试像下面这样传递它时:
# with unix shell you can set value to some variable and execute something in one line
_JAVA_OPTIONS='--add-opens java.base/java.lang=ALL-UNNAMED' java
另一方面,当我将这个选项直接作为
传递时,Java完全没问题,并且按照预期的方式工作:java --add-opens java.base/java.lang=ALL-UNNAMED
如果我没有直接控制CI执行Nexus IQ扫描步骤的java -jar
命令,我错过了什么,还有什么其他可能的方法来传递--add-opens java.base/java.lang=ALL-UNNAMED
参数?
事实证明,自Java 9以来,实现我想要的现代正确方法是使用JDK_JAVA_OPTIONS
环境变量。
_JAVA_OPTIONS
是一个未记录的特性
以下是JDK 9发行说明的节选:
JDK 9支持一个新的环境变量
JDK_JAVA_OPTIONS
,用于在命令行上指定的选项之前添加选项。与传统的/不受支持的_JAVA_OPTIONS
环境变量相比,新的环境变量有几个优点,包括能够包含java
启动器选项和@file
支持
我对Nexus IQ问题的最终解决方案是为JVM添加以下两个选项:
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED
如果你将面对InaccessibleObjectException
在其他一些软件包,只需添加一个--add-opens