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

Spring Boot生产部署与增量更新管理技术咨询

Spring Boot 生产部署与热更新实践方案

一、服务器更新流程设计(适配频繁变更场景)

针对你频繁修改视图、静态资源、Java类的需求,可按以下流程组织服务器上的更新操作:

  1. 源码与资源拉取

    • 把Git/SVN仓库同步到服务器固定目录,比如/opt/app/myapp-source,执行命令:
      git pull origin main  # Git拉取最新代码
      # 或 svn update       # SVN更新
      
  2. 分类型更新内容

    • 静态资源(JS/CSS)、视图(JSP):直接复制文件到应用运行目录
      • 内嵌Tomcat(解压jar包部署):复制到/opt/app/myapp/BOOT-INF/classes/static/(静态资源)、/opt/app/myapp/BOOT-INF/classes/templates/(JSP,需提前配置视图路径),Spring Boot默认会自动刷新资源(可在配置文件加spring.web.resources.chain.cache=false关闭缓存)
      • 独立Tomcat:复制到/opt/tomcat/webapps/myapp/static/、/opt/tomcat/webapps/myapp/WEB-INF/jsp/,无需重启应用
    • Java类变更:编译后替换class文件
      • Maven编译:mvn compile,把target/classes/下的编译产物复制到应用运行目录的BOOT-INF/classes/(内嵌)或WEB-INF/classes/(独立)
      • 若需要自动加载类变更,生产环境可搭配Spring Loaded或JRebel,避免手动复制;也可开启Spring Boot的debug模式(启动时加--debug),配合Actuator实现类重载
    • 依赖变更:更新依赖包后触发重载
      • Maven命令:mvn dependency:copy-dependencies -DoutputDirectory=/opt/app/myapp/BOOT-INF/lib/(内嵌)或/opt/tomcat/webapps/myapp/WEB-INF/lib/(独立)
      • 依赖更新后,独立Tomcat可通过Tomcat Manager重载应用;内嵌Tomcat调用Actuator的重启接口触发重载
  3. 触发重载/重启

    • 独立Tomcat:登录Tomcat Manager,点击"Reload"按钮
    • 内嵌Tomcat:调用Actuator的重启接口(需提前配置):
      curl -X POST http://localhost:8080/actuator/restart
      

二、独立Tomcat vs 内嵌Tomcat的选型建议

  • 独立Tomcat更适配你的场景:
    优势:支持Tomcat Manager的轻量重载(仅重启webapp,不重启整个Tomcat),会话序列化恢复机制成熟,静态资源和JSP可直接替换无需重启,依赖更新后重载即可生效,对用户影响极小
    劣势:需要额外维护Tomcat实例,部署需打包为war包,配置相对分散
  • 内嵌Tomcat的局限性:
    优势:部署简单(jar包直接运行),配置集中在Spring Boot配置文件,无需额外管理Tomcat
    劣势:默认无Tomcat Manager式的轻量重载,会话序列化需自定义配置(比如用Redis存会话),依赖更新后需重启整个应用,对用户影响更大

总结:如果核心需求是频繁变更时最小化用户影响,优先选独立Tomcat;若追求部署简洁、运维成本低,再考虑内嵌Tomcat配合Actuator和热加载配置。

三、内嵌Tomcat的重载与会话序列化支持

  • 重载功能:内嵌Tomcat本身不支持Tomcat Manager的轻量重载,但可通过Spring Boot Actuator实现应用重启:
    1. 添加Actuator依赖:
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
      
    2. 配置文件开启重启端点:
      management.endpoints.web.exposure.include=restart
      management.endpoint.restart.enabled=true
      
    3. 调用POST /actuator/restart触发应用重启,这是全应用重启,比Tomcat的webapp重载重,但配置得当也能快速完成
  • 会话序列化恢复:内嵌Tomcat默认不支持,需自定义会话持久化:
    • 推荐用Redis存储会话:添加spring-session-data-redis依赖,配置Redis连接信息,会话会持久化到Redis,应用重启后会话不丢失
    • 也可配置Tomcat的PersistentManager用文件存储会话,但性能不如Redis

四、Maven/Gradle配置示例与服务器操作

Maven配置(更新依赖、编译、启停)

  1. 更新依赖到指定目录(适配独立Tomcat)
    在pom.xml中添加插件:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.6.0</version>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory>
                    <overWriteReleases>false</overWriteReleases>
                    <overWriteSnapshots>true</overWriteSnapshots>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    运行命令:mvn dependency:copy-dependencies -DoutputDirectory=/opt/tomcat/webapps/myapp/WEB-INF/lib

  2. 编译并复制类文件

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version>
        <configuration>
            <source>17</source>
            <target>17</target>
        </configuration>
    </plugin>
    

    运行命令:

    mvn compile && cp -r target/classes/* /opt/app/myapp/BOOT-INF/classes/  # 内嵌Tomcat解压目录
    # 或 mvn compile && cp -r target/classes/* /opt/tomcat/webapps/myapp/WEB-INF/classes/  # 独立Tomcat
    
  3. 启动Spring Boot应用

    • 内嵌Tomcat直接运行jar:java -jar target/myapp.jar
    • Maven启动内嵌Tomcat:mvn spring-boot:run
    • Linux后台启动:nohup mvn spring-boot:run & 或 nohup java -jar target/myapp.jar &

Gradle配置示例

  1. 更新依赖到指定目录

    task copyDependencies(type: Copy) {
        from configurations.runtimeClasspath
        into "${buildDir}/libs/WEB-INF/lib"
    }
    build.dependsOn copyDependencies
    

    运行命令:./gradlew copyDependencies

  2. 编译并复制类文件

    task copyClasses(type: Copy) {
        from sourceSets.main.output.classesDirs
        into "/opt/app/myapp/BOOT-INF/classes" // 内嵌Tomcat解压目录
        // 或 into "/opt/tomcat/webapps/myapp/WEB-INF/classes" // 独立Tomcat
    }
    compileJava.finalizedBy copyClasses
    

    运行命令:./gradlew compileJava

  3. 启动Spring Boot应用

    • 直接运行jar:java -jar build/libs/myapp.jar
    • Gradle启动:./gradlew bootRun

Linux/Debian服务器Maven依赖路径

Maven默认本地仓库路径为~/.m2/repository/,即普通用户的/home/[用户名]/.m2/repository/,root用户的/root/.m2/repository/。

部署到独立Tomcat时,Maven自动将依赖放入WEB-INF/lib

修改pom.xml打包方式为war,Maven会自动把依赖打包到WEB-INF/lib/:

<packaging>war</packaging>

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <skip>true</skip> <!-- 无需内嵌Tomcat启动时添加 -->
    </configuration>
</plugin>

运行mvn package生成war包,放到Tomcat的webapps/目录,Tomcat会自动解压,依赖自动存入WEB-INF/lib/。

内容的提问来源于stack exchange,提问作者Jakub Królikowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:44:55