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
相关产品推荐
相关产品推荐

