HotCode2/HotCode2指南

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
2
3
4
5
Linux:
export MAVEN_OPTS="-javaagent:/Users/zhuyong/middleware/hotcode2/hotcode2.core/target/hotcode2.jar -Dhotcode.base=/path/to/your/code/directory"

Windows:
set MAVEN_OPTS="-javaagent:/Users/zhuyong/middleware/hotcode2/hotcode2.core/target/hotcode2.jar -Dhotcode.base=/path/to/your/code/directory"

然后以 mvn jetty:run 或者 mvnDebug jetty:run 来启动即可;

启动成功

以上方式如果成功以 HotCode2 启动后,就会在控制台下有如下的输出信息:

1
2
3
4
5
6
7
8
9
10
11
12
======================================= HotCode2 ======================================
Hello, HotCode2 (Ver: 2.0.0.20140821) !!!
Start JVM with HotCode2 on Java_1.7.0_40-b43 @ RunJettyRun-Mac OS X-10.9.4
HotCode2 Path:/Users/zhuyong/middleware/hotcode2/hotcode2.core/target/hotcode2.jar
Web Container: RunJettyRun
Monitered Resource Paths :
hotcode-biz.jar -----> /Users/zhuyong/middleware/hotcode-web/hotcode-biz/target/classes
webroot -----> /Users/zhuyong/middleware/hotcode-web/hotcode-war/src/main/webapp
WEB-INF/classes -----> /Users/zhuyong/middleware/hotcode-web/hotcode-war/target/classes
hotcode-dal.jar -----> /Users/zhuyong/middleware/hotcode-web/hotcode-dal/target/classes
Enabled Plugins: [ibatis_plugin, spring_plugin, webx2_plugin, webx3_plugin]
======================================= HotCode2 ======================================

那么修改一个类或配置文件看看吧,不用重启,立马生效哦! Enjoy it!

2. 常见问题

常见问题及解决方案——请直接使用 Ctrl + F 进行搜索

当应用使用 hotcode2 启动失败,或是启动成功,但热部署不生效,请检查以下日志信息:

  1. 应用控制台信息(IDE 的 console 或 xxx.stdout.log 等)
    hotcode2 会在控制台输出一些环境、配置等信息,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
======================================= HotCode2 ======================================
Hello, HotCode2 (Ver: 2.0.1.20150723-0946) !!!
Start JVM with HotCode2 on Java_1.6.0_65-b14-466.1-11M4716 @ Apache Tomcat/7.0.59.428-Mac OS X-10.10.4
HotCode2 Path: /Users/zhuyong/.hotcode2/agent/hotcode2.jar
Web Container: Tomcat
Container Home: /Users/zhuyong/middleware/taobao-tomcat/output/build
Monitered Resource Paths (Mapping class & non-xml resource) :
webroot -----> /Users/zhuyong/middleware/citrus-sample/petstore/web/src/main/webapp
petstore-biz-1.0.jar -----> /Users/zhuyong/middleware/citrus-sample/petstore/biz/target/classes
petstore-dal-1.0.jar -----> /Users/zhuyong/middleware/citrus-sample/petstore/dal/target/classes
WEB-INF/classes -----> /Users/zhuyong/middleware/citrus-sample/petstore/web/target/classes
Enabled Plugins: [ibatis_plugin, spring_plugin, webx3_plugin, webx2_plugin]
======================================= HotCode2 ======================================

主要关注以下几点:

a. hotcode2 agent 版本
b. jdk 版本
c. hotcode2 资源映射关系,只有资源映射目录下的 class/resource 才会由 hotcode2 进行管理并支持热部署

  1. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<workspace>
<deploy packages="com.alibaba">
<mapping src="WEB-INF/classes" dest="middleware/citrus-sample/petstore/web/target/classes" />
<!-- 因为这里的资源,最终在 war 包里是存在于 WEB-INF/classes 下,因此这里 src 则设置成 WEB-INF/classes -->
<mapping src="petstore-biz-1.0.jar" dest="middleware/citrus-sample/petstore/biz/target/classes" />
<!-- 这里的资源最终打在 war 包中的 WEB-INF/lib 下,且存在形式是 petstore-biz-1.0.jar -->
<mapping src="petstore-dal-1.0.jar" dest="middleware/citrus-sample/petstore/dal/target/classes" />
<mapping src="webroot" dest="middleware/citrus-sample/petstore/web/src/main/webapp" />
<!-- 这个比较好理解,应用是资源根目录,设置成 webroot -->
</deploy>
<plugins>
<plugin name="spring_plugin"></plugin>
<plugin name="ibatis_plugin"></plugin>
<plugin name="webx3_plugin"></plugin>
</plugins>
</workspace>

下面详细解释一下每一个配置项的功能:

  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 代码仓库,方便其他同学使用;
  1. plugins 标签
  • plugin 标签:表示需要开启的插件,将插件名填入到 name 属性中即可,当前可用的插件的有: spring_plugin 、ibatis_plugin 、web3_plugin。

-Dhotcode.base 说明

-Dhotcode.base 简化了以上复杂的配置文件编写过程,只需要设置 hotcode.base 为你的热部署的应用代码根目录即可;本质上,hotcode2.jar 会自动分析当前目录,并生成以上 workspace.xml 所需要的所有数据;因此,如果自动分析出错,你仍然可以使用 -Dhotcode.confFile 并手动完善 workspace.xml 文件