如何无需重部署完整Fat Jar,修改已上线的Spring Boot应用?
优化Spring Boot Fat Jar传输的方案
1. 仅传输修改的类文件并更新Jar
当你只修改了少量代码时,完全可以只传输编译后的.class文件,再在服务器上更新Fat Jar:
- 本地找到编译后的目标类文件(通常在
target/classes/目录下,路径对应包结构,比如com/example/demo/ModifiedClass.class) - 用FileZilla或scp仅传输这个小体积的
.class文件到服务器的临时目录 - 在服务器上执行Jar更新命令,将类文件替换到Fat Jar中:
jar uf /path/to/your-app.jar com/example/demo/ModifiedClass.class - 重启应用即可生效
2. 开发环境用Spring Boot DevTools远程热部署
如果是开发阶段频繁修改代码,可以用DevTools实现远程热部署,无需手动传输文件:
- 本地项目添加DevTools依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> - 在服务器启动应用时添加JVM参数开启远程连接:
java -jar your-app.jar --spring.devtools.remote.secret=your-secret-key - 本地IDE中配置远程DevTools连接(以IDEA为例:Run → Edit Configurations → 添加Remote,设置服务器地址和端口)
- 修改代码并编译后,DevTools会自动将更新的类同步到服务器,应用会自动重启加载新类
3. 拆分Jar为分层结构(适合生产/预发布环境)
利用Spring Boot的分层Jar功能,将依赖包和业务代码分离,每次仅传输业务代码层:
- 在
pom.xml中配置分层打包:<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <enabled>true</enabled> </layers> </configuration> </plugin> </plugins> </build> - 打包后会生成包含分层信息的Jar,服务器上可以用
spring-boot-jarmode-layertools工具解压Jar,将依赖层和业务层分开存放 - 后续更新时,仅打包并传输业务代码层的内容,无需重复传输体积庞大的第三方依赖包
4. 用rsync做增量传输
如果必须传输整个Jar,用rsync工具替代FileZilla,它会对比本地和服务器的Jar文件差异,仅传输变化的部分:
- 本地执行增量传输命令:
rsync -avz --progress your-app.jar user@your-server-ip:/path/to/deploy/ - 第一次传输是全量,后续仅传输Jar中变化的字节块,速度比全量传输快很多
内容的提问来源于stack exchange,提问作者Nadirspam
相关产品推荐
相关产品推荐

