Skip to content

热部署 beta

INFO

热部署实现复杂且需要兼容情况较多,如果这个项目帮你节省了开发时间,不妨点个 ,你的认可会让更多人发现它,你的支持是我更新的动力。如果不生效麻烦提交 反馈一下。

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 开始递增寻找可用端口
lombokJarPathlombok.jar 路径,远程动态编译时如果使用了lombok需要指定才能编译 (同上面)-
printSql是否打印执行的SQL语句false
includedClassLoaderPatterns要初始化热重载/热部署的ClassLoader。 与 excludedClassLoaderPatterns 只能同时配置一个-
excludedClassLoaderPatterns要排除初始化重载/热部署的ClassLoader。 与 includedClassLoaderPatterns 只能同时配置一个-
pluginPackages扫描其它路径上编写的插件,多个路径逗号分隔-
extraClasspathMacOS/Linux 加载扩展的class文件路径/var/tmp/debug-tools/classes
extraClasspathWinWindows 加载扩展的class文件路径c:/var/tmp/debug-tools/classes
watchResourcesMacOS/Linux 监听资源路径/var/tmp/debug-tools/resources
watchResourcesWinWindows 监听资源路径c:/var/tmp/debug-tools/resources
spring.basePackagePrefixSpring基础package前缀,多个路径逗号分隔-
disabledPlugins禁用的插件,多个逗号分隔-
autoHotswap是否自动热重载。在 ClassLoader 的 resources 路径下监视更改的类文件后在运行中的应用程序中重新加载类定义。它使用Java Instrumentation API来重新加载类字节码。false
autoHotswap.portJPDA连接端口,监听更改文件后进行热重载,启动时需要指定JPDA端口。-

3. 连接远程服务

点击 Idea 右侧的 工具栏唤醒 DebugTools 的窗口,点击 连接 填写远程地址。

connect_tools_window

输入 hosttcpPorthttpPort,点击 Save & Connent 按钮连接远程应用。

connect_input.png

成功附着应用后,DebugTools 会在显示附着状态。

  • R: 标识附着的是远程应用,L代表是本地应用。
  • Connected: 应用已经附着成功并连接服务成功。
  • i.g.f.d.t.t.a.DebugToolsTestApplication: 应用名称。
    • 附着时指定应用名时为指定的应用名
    • 未指定应用名时如果是 Spring 应用取 spring.application.name 配置项。
    • 未指定时取启动时jar中的 Main-Class
    • 未找到时取启动命令中的 sun.java.command

remote_attach_status

4. 使用热重载

4.1 多个文件

点击 按钮唤醒主页面。

hot_deploy_button.png

选择要部署的文件后

hot_deploy_dialog.png

  • Compiler Type: 文件的编译方式
    • Local Intellij Idea:通过 idea 编译器来编译变动的文件
    • Remote Attach Application:通过附着应用远程动态编译变动的文件
  • Select Type:文件选择的方式
    • Java:变动的 java 文件
    • Resources:变动的资源文件(待)
    • Vcs:选中通过 vcs工具来获取文件变动,不选中通过 文件修改时间 来获取文件变动

点击 OK 按钮,等待编译完成,编译完成后,会弹出编译成功的提示。

hot_deploy_result.png

TIP

  • 只有附着应用后才支持通过热部署的方式热重载变动文件
  • 使用远程动态编译时,附着应用必须要通过 JDK 启动,不能使用 JRE 启动。

4.2 单文件远程编译

通过右键菜单的 Remote Compile 'xxx' to Hot Reload 按钮可以通过远程动态编译的方式热重载单个变动文件.

hot_compile_file_button.png

热部署完成后,会弹出编译成功的提示。

hot_deploy_result.png

TIP

  • 只有附着应用后才支持通过热部署的方式热重载变动文件
  • 使用远程动态编译时,附着应用必须要通过 JDK 启动,不能使用 JRE 启动。