Java8迁Java17:Spring Boot3+Orika项目服务器如何配置--add-opens?
Java 17 + Spring Boot 3 项目服务器启动配置(含Orika所需VM参数)
针对你的项目场景(Java 17迁移、Orika最新版、Spring Boot 3内嵌Tomcat),以下是不同部署方式下的启动配置方案,核心是把--add-opens java.base/java.lang=ALL-UNNAMED这个VM参数传递给Java进程:
1. Jar包直接启动(内嵌Tomcat默认方式)
这是Spring Boot最常用的部署方式,直接在服务器上执行命令或配置脚本即可:
- 命令行直接启动:
java --add-opens java.base/java.lang=ALL-UNNAMED -jar your-project.jar - 封装成系统服务(Linux systemd):
创建/etc/systemd/system/your-app.service文件,内容如下(替换路径和用户):
然后执行命令启用并启动服务:[Unit] Description=Your Spring Boot Application After=network.target [Service] User=appuser ExecStart=/usr/bin/java --add-opens java.base/java.lang=ALL-UNNAMED -jar /opt/apps/your-project.jar Restart=always RestartSec=5 [Install] WantedBy=multi-user.targetsystemctl daemon-reload systemctl enable your-app systemctl start your-app - 使用启动脚本:
写一个简单的shell脚本start-app.sh,方便重复执行:
赋予执行权限后运行:#!/bin/bash APP_JAR="your-project.jar" JAVA_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED" nohup java $JAVA_OPTS -jar $APP_JAR > app.log 2>&1 & echo "Application started, log file: app.log"chmod +x start-app.sh && ./start-app.sh
2. War包部署到外部Tomcat
如果你的项目打包成War包部署到独立Tomcat,需要修改Tomcat的全局启动参数:
- Linux环境:
编辑Tomcat安装目录下bin/catalina.sh,在文件开头添加:CATALINA_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED" - Windows环境:
编辑bin/catalina.bat,在文件开头添加:set CATALINA_OPTS=--add-opens java.base/java.lang=ALL-UNNAMED - Tomcat配置文件方式:
部分Linux发行版的Tomcat会使用conf/tomcat.conf,直接在该文件中添加:CATALINA_OPTS="$CATALINA_OPTS --add-opens java.base/java.lang=ALL-UNNAMED"
3. 构建工具层面预配置(Maven/Gradle)
如果需要在本地开发或构建时自动带上参数,可以在构建工具中配置:
- Maven:
修改pom.xml中的Spring Boot插件,添加jvmArguments:
之后执行<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>--add-opens java.base/java.lang=ALL-UNNAMED</jvmArguments> </configuration> </plugin> </plugins> </build>mvn spring-boot:run启动时,参数会自动生效。 - Gradle:
修改build.gradle中的bootRun任务:
执行bootRun { jvmArgs = ['--add-opens', 'java.base/java.lang=ALL-UNNAMED'] }./gradlew bootRun即可自动带上参数。
4. Docker容器部署
如果用Docker打包部署,直接在Dockerfile的启动命令中加入参数:
FROM openjdk:17-jdk-slim WORKDIR /app COPY target/your-project.jar app.jar CMD ["java", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "-jar", "app.jar"]
补充说明
这个--add-opens参数是因为Java 17的模块化系统限制了内部API访问,而Orika库需要调用java.lang包的内部接口,所以必须显式开放权限给未命名模块(ALL-UNNAMED)。
内容的提问来源于stack exchange,提问作者fabigol
相关产品推荐
相关产品推荐

