说到Ja va热部署,这个命题在Ubuntu环境下其实有不少讲究。日常开发里,代码改一行就要等几十秒甚至几分钟的重启,这个体验确实让人头疼。所以,咱们直接切入正题,看看在Ubuntu上做Ja va热部署,到底有哪些靠谱的路径可选。

方案总览与选择
开发阶段和线上环境,向来是两套玩法。先说开发期怎么选:
- Spring Boot DevTools:零配置、快速重启,如果你的项目恰好是Spring Boot,这基本是首选。
- JRebel:商业插件,覆盖范围很广,方法体、字段、类结构、注解、Spring配置等大多数变更都能应对,几乎不重启。
- IDEA HotSwap / Arthas HotSwap:轻量级字节码替换,适合小改动,但对结构性变更有限制。
- DCEVM + HotswapAgent:免费增强版JVM组合拳,覆盖面广,但配置复杂,兼容性需要验证。
到了生产环境,建议直接放弃热部署的念头。安全第一,蓝绿部署、滚动更新、金丝雀发布才是正途。
关于原理,简单提一句:原生HotSwap受限于JVM,通常只支持方法体变更;DevTools本质上玩的是“快速重启”,靠双类加载器加速;JRebel和HotswapAgent则是通过字节码增强或替换来实现更广的覆盖。
Spring Boot项目在Ubuntu的两种高效做法
方案一:Spring Boot DevTools(开发期推荐)
这个方案操作起来很直接:
- 在pom.xml里添加依赖,记得加上
optional=true或者用Gradle的developmentOnly配置。 - IDEA里打开设置,找到Compiler,勾选上“Build project automatically”。
- 用IDEA的Debug模式或者mvn spring-boot:run启动应用,保存代码后就会触发“快速重启”。
需要说明的是,DevTools本质上是靠base classloader和restart classloader来加速重启的,严格来说并非“不重启就生效”,但它确实快得让人感觉不到等待。
方案二:JRebel(商业、覆盖广)
如果你愿意为效率付费:
- 在IntelliJ IDEA插件市场安装JRebel并重启IDE。
- 打开项目设置,在Facets里启用JRebel,然后在Run/Debug Configurations里添加JRebel的配置。
- 按提示激活(试用或授权)。
它的适用范围很广:方法体、字段、方法、类结构、注解、Spring配置等都能应付。不过再次提醒,线上环境不要碰。
非Spring Boot或通用Ja va项目的可选方案
IDEA HotSwap(轻量、快速)
适用范围有限:只适合修改方法体这类小改动。操作也简单:在IDEA以Debug模式运行,修改后编译(比如Ctrl+Shift+F9),多数情况下就能立即生效。但如果是新增字段、方法、注解或者改动类结构,那还是老老实实重启吧。
Arthas HotSwap(服务器字节码热替换)
这个方案适合线上紧急修复的场景:
- 先在本地安装Arthas,用curl下载arthas-boot.jar,然后ja va -jar启动。
- IDEA里安装ArthasHotSwap插件,修改类后执行Ma ven编译,右键选择ArthasHotSwap → Swap This Class,复制生成的远程命令。
- 在服务器上粘贴运行该命令,看到热替换成功的日志就行了。
建议在测试环境使用,如果Arthas占用进程太久,记得执行stop退出。
DCEVM + HotswapAgent(免费增强)
核心思路是用DCEVM替换或增强JVM,配合HotswapAgent实现更广的类结构热替换。优点是免费覆盖面广,缺点是配置复杂,对部分框架或版本可能有兼容性问题,需要充分回归测试。
传统Tomcat JSP项目与容器化场景
Tomcat JSP热部署
在$CATALINA_HOME/conf/server.xml的标签内添加:
保存后重启Tomcat。适合开发期快速看到JSP和静态资源的变化。生产环境不建议开启,防止内存泄漏和类加载器冲突。
Docker开发期热更新
思路很简单:把宿主机的项目目录挂载到容器内,代码变更后触发容器内编译或直接重启容器。示例:
docker run --name app -it -v /host/project:/app -p 8080:8080 openjdk:8 ja va -jar /app/app.jar
# 更新jar后重启
docker restart app
容器化环境更推荐“挂载+重建/重启”的迭代方式,生产环境则用镜像更新和滚动发布策略。
注意事项与最佳实践
- 环境区分要明确:热部署/热加载只用于开发或测试。生产环境必须关闭,采用蓝绿、滚动、金丝雀等发布策略保证稳定性和可回滚性。
- 变更边界要清楚:原生HotSwap只支持方法体变更;结构性变更(新增字段、方法、注解、类)需要借助JRebel、DCEVM+HotswapAgent或者直接重启。
- 静态资源处理:前端JS、CSS、HTML可以在IDEA启用Live Edit,或者使用前端框架自带的热重载工具。
- 故障排查技巧:确认以Debug模式运行(HotSwap/Arthas需要);查看插件和控制台日志;必要时手动触发编译(如Ctrl+Shift+F9);验证变更是否在工具支持范围内。