Spring Boot生产部署与增量更新管理技术咨询
Spring Boot 生产部署与热更新实践方案
一、服务器更新流程设计(适配频繁变更场景)
针对你频繁修改视图、静态资源、Java类的需求,可按以下流程组织服务器上的更新操作:
源码与资源拉取
- 把Git/SVN仓库同步到服务器固定目录,比如
/opt/app/myapp-source,执行命令:git pull origin main # Git拉取最新代码 # 或 svn update # SVN更新
- 把Git/SVN仓库同步到服务器固定目录,比如
分类型更新内容
- 静态资源(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/,无需重启应用
- 内嵌Tomcat(解压jar包部署):复制到
- Java类变更:编译后替换class文件
- Maven编译:
mvn compile,把target/classes/下的编译产物复制到应用运行目录的BOOT-INF/classes/(内嵌)或WEB-INF/classes/(独立) - 若需要自动加载类变更,生产环境可搭配Spring Loaded或JRebel,避免手动复制;也可开启Spring Boot的debug模式(启动时加
--debug),配合Actuator实现类重载
- Maven编译:
- 依赖变更:更新依赖包后触发重载
- Maven命令:
mvn dependency:copy-dependencies -DoutputDirectory=/opt/app/myapp/BOOT-INF/lib/(内嵌)或/opt/tomcat/webapps/myapp/WEB-INF/lib/(独立) - 依赖更新后,独立Tomcat可通过Tomcat Manager重载应用;内嵌Tomcat调用Actuator的重启接口触发重载
- Maven命令:
- 静态资源(JS/CSS)、视图(JSP):直接复制文件到应用运行目录
触发重载/重启
- 独立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实现应用重启:
- 添加Actuator依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> - 配置文件开启重启端点:
management.endpoints.web.exposure.include=restart management.endpoint.restart.enabled=true - 调用
POST /actuator/restart触发应用重启,这是全应用重启,比Tomcat的webapp重载重,但配置得当也能快速完成
- 添加Actuator依赖:
- 会话序列化恢复:内嵌Tomcat默认不支持,需自定义会话持久化:
- 推荐用Redis存储会话:添加
spring-session-data-redis依赖,配置Redis连接信息,会话会持久化到Redis,应用重启后会话不丢失 - 也可配置Tomcat的
PersistentManager用文件存储会话,但性能不如Redis
- 推荐用Redis存储会话:添加
四、Maven/Gradle配置示例与服务器操作
Maven配置(更新依赖、编译、启停)
更新依赖到指定目录(适配独立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编译并复制类文件
<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启动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 &
- 内嵌Tomcat直接运行jar:
Gradle配置示例
更新依赖到指定目录
task copyDependencies(type: Copy) { from configurations.runtimeClasspath into "${buildDir}/libs/WEB-INF/lib" } build.dependsOn copyDependencies运行命令:
./gradlew copyDependencies编译并复制类文件
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启动Spring Boot应用
- 直接运行jar:
java -jar build/libs/myapp.jar - Gradle启动:
./gradlew bootRun
- 直接运行jar:
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
相关产品推荐
相关产品推荐

