热部署 beta
1. 什么是热部署
传统的部署流程一般为 提交代码->拉取代码->打包->部署->重启项目
后才能让编写的代码生效。
热部署可以跳过这繁琐的流程,开发者修改代码后无需手动触发打包或重启服务,应用即可秒级
加载新逻辑并运行,极大缩短反馈周期。
热部署基于 热重载 实现,热重载仅支持本地环境,热部署则让远程应用也可以热重载。
2. 开启热部署
TIP
热部署需要特定的jdk才能生效,请先参考JDK安装完成JDK的初始化。
2.1 添加JVM参数
【Java 8】 启动时添加如下的 JVM 参数。
shell
-XXaltjvm=dcevm -javaagent:${agentPath}/debug-tools-agent.jar=${conf}
【Java 11】启动时添加如下的 JVM 参数。
shell
-javaagent:${agentPath}/debug-tools-agent.jar=${conf} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.desktop/java.beans=ALL-UNNAMED --add-opens java.desktop/com.sun.beans=ALL-UNNAMED --add-opens java.desktop/com.sun.beans.introspect=ALL-UNNAMED --add-opens java.desktop/com.sun.beans.util=ALL-UNNAMED --add-opens java.base/sun.security.action=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED
【Java 17/21】启动时添加如下的 JVM 参数。
shell
-XX:+AllowEnhancedClassRedefinition -javaagent:${agentPath}/debug-tools-agent.jar=${conf} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.desktop/java.beans=ALL-UNNAMED --add-opens java.desktop/com.sun.beans=ALL-UNNAMED --add-opens java.desktop/com.sun.beans.introspect=ALL-UNNAMED --add-opens java.desktop/com.sun.beans.util=ALL-UNNAMED --add-opens java.base/sun.security.action=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED
agentPath
为 debug-tools-agent.jar 的路径conf
为传入 agent 的配置信息,格式为key1=value1,key2=value2
2.2 可选配置
可选key项 | 含义 | value取值 | 取值示例 |
---|---|---|---|
hotswap | 是否开启热重载/热部署 | true:开启 false:关闭 | ture |
server | 是否启动Server给客户端连接 | true:开启 false:关闭 | ture |
tcpPort | 监听的TCP端口 (server=true时才生效) | 可用端口 | 12345 |
httpPort | 监听的HTTP端口 (server=true时才生效) | 可用端口 | 22222 |
printSql | 是否打印执行的SQL语句 | true:开启 false:关闭 | ture |
propertiesFilePath | 外部配置文件路径 | 配置文件地址 | /etc/debug-tools/conf/debug-tools-agent.properties |
propertiesFilePath 配置
key | 含义 | 默认值 |
---|---|---|
hotswap | 是否开启热重载/热部署 (同上面) | true |
server | 是否启动Server给客户端连接 (同上面) | true |
tcpPort | 监听的TCP端口 (server=true时才生效) (同上面) | 默认从 12345 开始递增寻找可用端口 |
httpPort | 监听的HTTP端口 (server=true时才生效) (同上面) | 默认从 22222 开始递增寻找可用端口 |
lombokJarPath | lombok.jar 路径,远程动态编译时如果使用了lombok需要指定才能编译 (同上面) | - |
printSql | 是否打印执行的SQL语句 | false |
includedClassLoaderPatterns | 要初始化热重载/热部署的ClassLoader。 与 excludedClassLoaderPatterns 只能同时配置一个 | - |
excludedClassLoaderPatterns | 要排除初始化重载/热部署的ClassLoader。 与 includedClassLoaderPatterns 只能同时配置一个 | - |
pluginPackages | 扫描其它路径上编写的插件,多个路径逗号分隔 | - |
extraClasspath | MacOS/Linux 加载扩展的class文件路径 | /var/tmp/debug-tools/classes |
extraClasspathWin | Windows 加载扩展的class文件路径 | c:/var/tmp/debug-tools/classes |
watchResources | MacOS/Linux 监听资源路径 | /var/tmp/debug-tools/resources |
watchResourcesWin | Windows 监听资源路径 | c:/var/tmp/debug-tools/resources |
spring.basePackagePrefix | Spring基础package前缀,多个路径逗号分隔 | - |
disabledPlugins | 禁用的插件,多个逗号分隔 | - |
autoHotswap | 是否自动热重载。在 ClassLoader 的 resources 路径下监视更改的类文件后在运行中的应用程序中重新加载类定义。它使用Java Instrumentation API来重新加载类字节码。 | false |
autoHotswap.port | JPDA连接端口,监听更改文件后进行热重载,启动时需要指定JPDA端口。 | - |
3. 连接远程服务
点击 Idea 右侧的 工具栏唤醒 DebugTools 的窗口,点击
填写远程地址。
输入 host 、tcpPort 和 httpPort,点击 Save & Connent
按钮连接远程应用。
成功附着应用后,DebugTools 会在显示附着状态。
R
: 标识附着的是远程应用,L
代表是本地应用。Connected
: 应用已经附着成功并连接服务成功。i.g.f.d.t.t.a.DebugToolsTestApplication
: 应用名称。- 附着时指定应用名时为
指定的应用名
。 - 未指定应用名时如果是 Spring 应用取
spring.application.name
配置项。 - 未指定时取启动时jar中的
Main-Class
。 - 未找到时取启动命令中的
sun.java.command
。
- 附着时指定应用名时为
4. 使用热重载
4.1 多个文件
点击 按钮唤醒主页面。
选择要部署的文件后
Compiler Type
: 文件的编译方式Local Intellij Idea
:通过 idea 编译器来编译变动的文件Remote Attach Application
:通过附着应用远程动态编译变动的文件
Select Type
:文件选择的方式Java
:变动的 java 文件Resources
:变动的资源文件(待)Vcs
:选中通过 vcs工具来获取文件变动,不选中通过 文件修改时间 来获取文件变动
点击 OK
按钮,等待编译完成,编译完成后,会弹出编译成功的提示。
TIP
- 只有附着应用后才支持通过热部署的方式热重载变动文件
- 使用远程动态编译时,附着应用必须要通过 JDK 启动,不能使用 JRE 启动。
4.2 单文件远程编译
通过右键菜单的 Remote Compile 'xxx' to Hot Reload
按钮可以通过远程动态编译的方式热重载单个变动文件.
热部署完成后,会弹出编译成功的提示。
TIP
- 只有附着应用后才支持通过热部署的方式热重载变动文件
- 使用远程动态编译时,附着应用必须要通过 JDK 启动,不能使用 JRE 启动。