You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot插件构建的Docker镜像中MANIFEST.MF的Add-Opens条目失效

问题:Spring Boot 3 + JDK 17 镜像部署时Add-Opens清单条目失效

我有一个基于Spring Boot 3 + JDK 17的应用,因JRuby触发以下警告:

2023-07-14T11:13:35.651Z [main] WARN FilenoUtil : Native subprocess control requires open access to the JDK IO subsystem
Pass '--add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED' to enable.

通过命令行参数或JDK_JAVA_OPTIONS环境变量传入上述参数可消除警告。我尝试通过在MANIFEST.MF中添加Add-Opens条目实现相同效果,在build.gradle.kts中做了如下配置:

// build.gradle.kts

bootJar {
  requiresUnpack("**/asciidoctorj-*.jar")

  manifest {
    attributes["Add-Opens"] = "java.base/java.io java.base/sun.nio.ch"
  }
}

确认Spring Boot插件生成的胖JAR的MANIFEST.MF包含预期条目,且本地用java -jar运行时警告消失。但使用gradle bootBuildImage构建默认配置的Docker镜像并部署后,仍出现相同警告,且容器内的MANIFEST.MF确实存在该条目。

关键原因(更新)

Add-Opens清单条目仅在使用java -jar启动JVM时受支持。

有效解决方法

方法一:配置bootBuildImage添加JVM参数

在build.gradle.kts中修改bootBuildImage配置,通过环境变量追加JVM参数:

bootBuildImage {
    environment = mapOf(
        "BPE_APPEND_JAVA_TOOL_OPTIONS" to "--add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED"
    )
}

这样构建出的镜像在启动时会自动加载这些JVM参数,消除警告。

方法二:部署时设置环境变量

在容器部署阶段,设置JAVA_TOOL_OPTIONS或JDK_JAVA_OPTIONS环境变量,值为:

--add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED

例如使用Docker run命令:

docker run -e JAVA_TOOL_OPTIONS="--add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED" your-image-name

内容的提问来源于stack exchange,提问作者Rad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:15:23