Kir*_*ill 6 java java-opts javaoptions
我正在尝试解决使用 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修复传递给运行的 JVM nexus-iq-cli.jar。
不幸的是,我无法完全控制java -jar ...在 CI 上执行的命令,否则我只会--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
Run Code Online (Sandbox Code Playgroud)
另一方面,当我直接传递此选项时,Java 完全正常并且按预期运行:
java --add-opens java.base/java.lang=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)
--add-opens java.base/java.lang=ALL-UNNAMED如果我无法直接控制java -jarCI 执行 Nexus IQ 扫描步骤的命令,我缺少什么以及传递参数的其他可能方法是什么?
事实证明,自 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
Run Code Online (Sandbox Code Playgroud)
如果您将面临InaccessibleObjectException 其他包裹,只需再添加一个--add-opens
| 归档时间: |
|
| 查看次数: |
50576 次 |
| 最近记录: |