无法识别的选项:--add-opens 与 _JAVA_OPTIONS 一起传递时

问题描述 投票:0回答:2

我正在尝试使用 Java 17 运行时运行 Nexus IQ 扫描仪来修复问题

错误是

java.lang.reflect.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-opens

当我尝试按如下方式通过时:

# 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 扫描步骤的

--add-opens java.base/java.lang=ALL-UNNAMED
命令,我缺少什么以及传递
java -jar
参数的其他可能方法是什么?

java java-opts javaoptions
2个回答
13
投票

事实证明,自 Java 9 以来,实现我想要的目标的现代正确方法是 使用

JDK_JAVA_OPTIONS
环境变量。

_JAVA_OPTIONS
是一个未记录的功能

这里摘录自 JDK 9 发行说明

JDK 9 支持新的环境变量

JDK_JAVA_OPTIONS
将选项添加到命令行上指定的选项。与旧版/不受支持的
_JAVA_OPTIONS
环境变量相比,新环境变量具有多个优势,包括能够包含
java
启动器选项和
@file
支持

我对 Nexus IQ 问题的最终解决方案是为 JVM 添加以下 2 个选项:

--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED

如果您在其他包裹上遇到

InaccessibleObjectException 
,只需再添加一个
--add-opens


0
投票

对于 Azure Spring 应用程序,我在下面添加了它并且它有效。

环境变量:

JDK_JAVA_OPTIONS=--add-opens java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED
© www.soinside.com 2019 - 2024. All rights reserved.