将 --add-opens 标志与基于 Adoptium 的 java 17 docker 映像一起使用会导致无法识别的选项错误

Syn*_*ity 3 java docker

我有基于 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 实现都应该使用它,还是我错了?

Syn*_*ity 7

因此,当我尝试寻找解决方案时,我遇到了以下旧的 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