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

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.target
    
    然后执行命令启用并启动服务:
    systemctl 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:08:13