JVM 的 Hot Swap 功能比较弱,只能对修改方法体有效,例如新增加了一个方法,类等就无能为力了。有 2 个比较好用的热加载工具,JRebel 和 SpringLoaded,下图比较了对它们进行了比较(虽然看不懂日语,但是 o 越多肯定越强大,^_^)
下面用 Module Xbox 为例介绍怎么使用它们。
免费,只能使用 -javaagent
参数的方式启动项目,但是在 IDEA 里热加载后不能 Debug
,因为没有相应的插件通知 IDEA 更新断点的信息,不过可以使用 IDEA 远程调试解决这个问题,具体细节在 IDEA + Maven + SpringLoaded 远程调试
。
-javaagent:/Users/Biao/Baidu/workspace/springloaded-1.2.3.RELEASE.jar -noverify
像上面一样在 IDEA 里启动项目 Xbox,虽然热加载能生效,但却不能 Debug,还是不够方便,通过远程调试就能客服这一缺点。
类 Unix 下修改 mvnDebug
内容,Windows 下修改 mvnDebug.cmd
:
MAVEN_DEBUG_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"
MAVEN_OPTS="-javaagent:/Users/Biao/Documents/workspace/springloaded-1.2.3.RELEASE.jar -noverify $MAVEN_OPTS"
echo Preparing to Execute Maven in Debug Mode
env MAVEN_OPTS="$MAVEN_OPTS $MAVEN_DEBUG_OPTS" $(dirname $0)/mvn "$@"
address=8000: 远程调试端口号是 8000,可修改
suspend=y: 只有远程调试连接进来后才继续往下运行
suspend=n: 不需要等待远程调试连接
使用 mvnDebug tomcat7:run
运行 Xbox 项目,这样就用 Debug 模式,并且使用 SpringLoaded 启动了 Xbox 项目,输出:
Preparing to Execute Maven in Debug Mode
objc[50345]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
Listening for transport dt_socket at address: 8000
[INFO] Scanning for projects...
[INFO]
看到 JavaLaunchHelper 说明 SpringLoaded 生效了
看到 Listening for transport dt_socket at address: 8000 说明可以远程调试了
也可以不用上面的 2 步,而是直接用下面的命令运行达到相同的效果,只是每次输入的命令长一些
MAVENOPTS="-Xdebug -Xrunjdwp:transport=dtsocket,server=y,suspend=n,address=8000 -Xnoagent -Djava.compiler=NONE -javaagent:/Users/Biao/Documents/workspace/springloaded-1.2.3.RELEASE.jar -noverify" mvn tomcat7:run
IDEA 里远程调试
输入 Name
,Host
,Port
点击 OK
按钮即可,其他的不用修改:
点击 Remote-Xbox
就可以远程调试了
在 IDEA 里打上断点看看效果,修改,添加,删除方法,断点也能生效了
很贵,一年 $365,可以免费试用 14 天(过期后如果还想用,嘿嘿,把系统时间修改回来),使用 JRebel 插件启动项目,热加载后可以 Debug
。
注:如果 JRebel 使用
-javaagent
的方式启动项目,同样在热加载后不能 Debug,这时就和 SpringLoaded 一样了,还不如用 SpringLoaded。
Plugins
,点击 Browse repositories...
activate
,在弹出的注册窗口里输入注册信息(邮箱必须是有效的邮箱地址,其它的随意填写),然后点击 Activate JRebel