1. HotCode2 本地热部署
HotCode2, Stop Redeploying! 无论是修改 Java 文件,还是框架配置文件都无需重启 Java 虚拟机而立即生效!
选择你的启动方式
HotCode2 本质上是一个 Java Agent,要使用 HotCode2 只需要将 HotCode2 的 Agent 添加到 JVM 的启动参数中即可。
下面给出了可能的三种方式,你可以根据情况选择一种方式。
1、在命令行参数中添加 HotCode2 Agent
如果你要在以命令行启动 JVM,那么请先到这里下载hotcode.jar,然后将 HotCode Agent 添加到 JVM 的启动参数中:
1 | -javaagent:/Users/zhuyong/middleware/hotcode2/hotcode2.core/target/hotcode2.jar -Dhotcode.base=/path/to/your/source/code/folder |
其中将 /Users/zhuyong/middleware/hotcode2/hotcode2.core/target/hotcode2.jar
替换成你下载的 hotcode2.jar 的路径,将 /path/to/your/source/code/folder
替换成你的应用代码的根目录;
2、通过 HotCode2 IDE 插件启动
HotCode2 IDE 插件可以一键启用 HotCode2:
Eclipse 插件具体请参考:[这里]
IDEA 插件具体请参考:这里
3、在 Maven 中采用 mvn jetty:run 或者 mvnDebug jetty:run 启动应用
如果你是采用 mvn jetty:run 或者 mvnDebug jetty:run 的方式启动应用,那么你也需要下载 hotcode2.jar,然后设置 MAVEN_OPTS 环境变量:
1 | Linux: |
然后以 mvn jetty:run 或者 mvnDebug jetty:run 来启动即可;
启动成功
以上方式如果成功以 HotCode2 启动后,就会在控制台下有如下的输出信息:
1 | ======================================= HotCode2 ====================================== |
那么修改一个类或配置文件看看吧,不用重启,立马生效哦! Enjoy it!
2. 常见问题
常见问题及解决方案——请直接使用 Ctrl + F 进行搜索
当应用使用 hotcode2 启动失败,或是启动成功,但热部署不生效,请检查以下日志信息:
- 应用控制台信息(IDE 的 console 或 xxx.stdout.log 等)
hotcode2 会在控制台输出一些环境、配置等信息,如下:
1 | ======================================= HotCode2 ====================================== |
主要关注以下几点:
a. hotcode2 agent 版本
b. jdk 版本
c. hotcode2 资源映射关系,只有资源映射目录下的 class/resource 才会由 hotcode2 进行管理并支持热部署
- hotcode2 日志路径
hotcode2 会将运行中的出错信息输出到 ${user.home}/.hotcode2/logs 目录下:
a. core.log 对应 hotcode2 class reload 相关的信息
b. sdk.log 对应框架插件相关的 reload 信息,如 Spring 配置文件 reload 时出错,sdk.log 里将会有相应的出错信息; Spring, IBatis等框架的 reload 出错信息也会抛到应用层面,让开发者第一时间看到出错信息,方便修改对应的配置文件;
通过查看以上日志未发现明显异常或错误,请尝试下面的常见问题及解决思路!
3. HotCode2 命令行参数
HotCode2 提供了如下的命令行参数,来控制 HotCode2 内部的行为:
-D参数 | 可选值 | 默认值 | 说明 |
---|---|---|---|
hotcode.confFile | /home/xxx/yyy/workspace.xml | false | HotCode2 的 class/resource mapping 配置文件,目前大部分情况下,由hotcode自动解析,当解析不准确时,可以手动配置,详细配置文件参考’HotCode2 配置文件详解’ |
hotcode.dump |true/false |false| 控制是否输出经过 HotCode2 变换的 class 文件,可以在 {user.home}/.hotcode2/classdump/目录下看到每个 class 的 dump 结果|
|hotcode.log.level |INFO/ERROR |INFO| 控制 HotCode2 内部的日志输出,默认为 ERROR;设置成 INFO 可以看到 HotCode2 内部的一些 class 变换信息和 resource 映射结果等;HotCode2 日志路径位于 {user.home}/.hotcode2/logs/目录下,core.log 为 hotcode2 核心日志文件,sdk.log为 sdk、插件相关的日志文件,2.0.1.20150129 后,该参数默认值为 INFO|
|hotcode.verify |true/false| false| 使用 ASM ClassVerify 对变换过后的类的 byte array进行验证,验证结果将在 console 上输出|
|hotcode.resource.skip |true/false| false| 控制是否从 workspace 查找资源文件的映射,如果设置为 true,则只会对 class 文件进行映射;此参数用于resource文件中有变量替换比较难搞定,且对资源映射需求不大的同学使用,2.0.0.20140821 版本后提供,2.0.1.20150129 后,该参数默认值为 true,即对 vm/jsp/html/css/js 等一些静态资源做映射,xml/properties 不映射|
|hotcode.escapedClassPattern |Java 正则表达式,如 com.taobao.*,也可以指定全类名| 无| 控制 HotCode2 加载 workspace 中的类时,哪些是要排除掉的,即不需要进行 HotCode2 热部署管理,主要在一些特殊场景下 HotCode2 有 bug 时使用,2.0.0.20141027 版本后提供|
|hotcode.base |/home/xxx/yyy/project| 无| 指定资源映射的目标,应用源码目录,2.0.1.20150211 版本后提供,用于简化 workspace 配置,但是 hotcode.confFile 会优先于 hotcode.base|
|hotcode.remoteserver |http://ip:port| 无| 远程部署时,在本地配置,指定远程服务器的地址和端口,2.0.1.20161130 版本后提供|
|hotcode.newremote |port |无| 指定远程热部署的开放端口,在远程服务器配置,与hotcode.remoteserver的ip:port中的port对应,2.0.1.20161130 版本后提供|
|hotcode.remote |http://ip:port| 无| 远程部署时,指定远程同步资源文件的服务地址,2.0.1.20150211 版本后提供 不推荐,请使用hotcode.newremote和hotcode.remoteserver|
|hotcode.remoteAutoconfig| true/false| true| 远程部署时,本地客户端使用,对本地文件进行autoconfig,默认读取~/antx.properties,远程可以拿到autoconfig之后的资源文件进行加载。|
4. HotCode2 配置文件详解
一份完整的 HotCode2 配置文件如下:
1 |
|
下面详细解释一下每一个配置项的功能:
- deploy 标签
- packages(可选):用于指定需要热部署的包,设置该属性以后,只有以指定包名开头的类才能进行热替换,多个包名用
英文逗号
隔开。该属性可以加快启动速度。 - mapping 标签:代表一个资源的映射关系,通过这个标签,可以将应用中的 jar 包、Web 目录等映射回工作目录,HotCode2 会监视配置的工作目录下的对应的文件的变化,以触发 Reload,它有两个属性,分别为 src 和 dest :
- src 属性:表示一个资源映射关系的源,这块配置直接关系到资源映射的准确性,因此尽量填写原资源路径中关键的一部分,如 jar 包的名称或是 WEB-INF/classes 这样的开放目录名;
- dest 属性:表示一个资源映射关系的目标,如果需要映射到普通的 Java 工程上,那么填写 Java 工程对应的 target/classes 目录,如果需要映射到 web 应用的 Web 目录上,那么填写 web 应用中 web 目录对应的源代码的目录,即 webapps 或 webroot ;注意,这里 dest 可以配置成相对于当前
workspace.xml
文件的相对路径,这样可以将该文件上传至 svn 或 git 代码仓库,方便其他同学使用;
- plugins 标签
- plugin 标签:表示需要开启的插件,将插件名填入到 name 属性中即可,当前可用的插件的有: spring_plugin 、ibatis_plugin 、web3_plugin。
-Dhotcode.base 说明
-Dhotcode.base
简化了以上复杂的配置文件编写过程,只需要设置 hotcode.base
为你的热部署的应用代码根目录即可;本质上,hotcode2.jar
会自动分析当前目录,并生成以上 workspace.xml
所需要的所有数据;因此,如果自动分析出错,你仍然可以使用 -Dhotcode.confFile
并手动完善 workspace.xml
文件