我有基于 java 17 的 spring 项目,我必须通过 SSL 会话重用连接到 ftps 服务器。互联网上有很多针对此问题的解决方案,所有这些解决方案都需要设置以下 JVM 标志:
--add-opens java.base/sun.security.ssl=ALL-UNNAMED
--add-opens java.base/sun.security.util=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)
该解决方案在开发期间完美运行,但我无法创建工作的 docker 映像。目前,这些映像是使用jib-maven-plugin基础映像创建的amd64/eclipse-temurin:17.0.1_12-jre-alpine,但我已经尝试过较新版本的 Java 17 及更早版本,我什至也尝试过 JDK 映像。
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.1.4</version>
<configuration>
<from>
<image>${image.base}</image>
</from>
<to>
<image>${image.name}:${project.version}</image>
</to>
<container>
<mainClass>${image.mainClass}</mainClass>
<jvmFlags>
<jvmFlag>--add-opens java.base/sun.security.ssl=ALL-UNNAMED</jvmFlag>
<jvmFlag>--add-opens java.base/sun.security.util=ALL-UNNAMED</jvmFlag>
</jvmFlags>
</container>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这是当前的设置,所有变量都是正确的,并且之前工作过,我只是添加了 JVM 标志,但是每当我尝试启动 docker 容器时,我都会收到以下错误消息:
无法识别的选项:--add-opens java.base/sun.security.ssl=ALL-UNNAMED 错误:无法创建 Java 虚拟机。错误:发生致命异常。程序将会退出。
我也尝试添加这个 JVM 参数,JAVA_TOOL_OPTIONS但得到了相同的结果。由于我不知道可能会出现什么问题,所以我转储了 docker 映像 tar,并检查了 config.json 中定义的入口点,据我所知,这看起来很好。
"Entrypoint":[
"java",
"--add-opens java.base/sun.security.ssl=ALL-UNNAMED --add-opens java.base/sun.security.util=ALL-UNNAMED",
"-cp",
"@/app/jib-classpath-file",
"com.example.demo.DemoApplication"
],
Run Code Online (Sandbox Code Playgroud)
据我所知 --add-opens 不是一个可选开关,每个 java 实现都应该使用它,还是我错了?
因此,当我尝试寻找解决方案时,我遇到了以下旧的 OpenJDK 错误报告:
https://bugs.openjdk.org/browse/JDK-8173128
根据报告中的第一条评论,解决方案如下:
<jvmFlags>
<jvmFlag>--add-opens=java.base/sun.security.ssl=ALL-UNNAMED</jvmFlag>
<jvmFlag>--add-opens=java.base/sun.security.util=ALL-UNNAMED</jvmFlag>
</jvmFlags>
Run Code Online (Sandbox Code Playgroud)
确实它解决了问题,所以在和定义=之间应该有一个标记。这不是开发期间在 Windows 上运行 IntelliJ 时出现的问题。--add-opensmodule/package
| 归档时间: |
|
| 查看次数: |
4213 次 |
| 最近记录: |