无法识别的选项:——add-在与_JAVA_OPTIONS传递时打开



我正在尝试修复使用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

相关内容

  • 没有找到相关文章

最新更新