Spring Boot应用部署服务器时--add-opens参数配置问题求助
解决Apache Arrow的MemoryUtil初始化失败问题
问题根源
Apache Arrow的MemoryUtil类需要访问Java NIO包的内部API,Java 9+的模块系统默认限制了这类访问,因此必须通过--add-opens=java.base/java.nio=ALL-UNNAMED这个VM参数开放权限。
无效方案分析
- 移除Arrow依赖无效:大概率是项目中其他依赖间接引入了Apache Arrow(比如部分大数据、数据处理类库),可以执行
mvn dependency:tree命令排查依赖树,定位间接引入的Arrow依赖。 - application.properties中配置K8s环境变量错误:
spec.containers[0].env是Kubernetes Deployment/YAML配置的语法,并非Spring Boot application.properties的配置项,放在此处不会生效。
正确的服务器端配置方案
场景1:直接以Jar包形式运行应用
启动命令中直接追加VM参数:
java --add-opens=java.base/java.nio=ALL-UNNAMED -jar your-spring-boot-app.jar
如果使用脚本启动,可将参数写入启动脚本的JAVA_OPTS变量:
export JAVA_OPTS="--add-opens=java.base/java.nio=ALL-UNNAMED" java $JAVA_OPTS -jar your-spring-boot-app.jar
场景2:使用Kubernetes部署
需在Deployment的YAML配置文件中添加配置,而非Spring Boot的application.properties:
方式一:通过JAVA_OPTS环境变量传递
spec: containers: - name: your-app-container image: your-app-image:latest env: - name: JAVA_OPTS value: "--add-opens=java.base/java.nio=ALL-UNNAMED"
方式二:直接指定启动命令
spec: containers: - name: your-app-container image: your-app-image:latest command: ["java"] args: ["--add-opens=java.base/java.nio=ALL-UNNAMED", "-jar", "/app/your-spring-boot-app.jar"]
场景3:使用Docker容器部署
在Dockerfile中整合VM参数到启动逻辑:
方式一:直接写入ENTRYPOINT
FROM openjdk:17-jdk-slim COPY target/your-spring-boot-app.jar /app.jar ENTRYPOINT ["java", "--add-opens=java.base/java.nio=ALL-UNNAMED", "-jar", "/app.jar"]
方式二:通过环境变量传递
FROM openjdk:17-jdk-slim COPY target/your-spring-boot-app.jar /app.jar ENV JAVA_OPTS="--add-opens=java.base/java.nio=ALL-UNNAMED" ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app.jar"]
场景4:部署到Tomcat等应用服务器
修改Tomcat的catalina.sh(Linux)或catalina.bat(Windows),在JAVA_OPTS配置中追加参数:
JAVA_OPTS="$JAVA_OPTS --add-opens=java.base/java.nio=ALL-UNNAMED"
额外建议
如果确实不需要Arrow依赖,执行mvn dependency:tree找到所有引入Arrow的上游依赖,在pom.xml中排除:
<dependency> <groupId>xxx</groupId> <artifactId>xxx-dependency</artifactId> <version>xxx</version> <exclusions> <exclusion> <groupId>org.apache.arrow</groupId> <artifactId>arrow-vector</artifactId> </exclusion> <exclusion> <groupId>org.apache.arrow</groupId> <artifactId>arrow-memory-netty</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者Prakhar Vaibhav
相关产品推荐
相关产品推荐

