IDEA 热加载神器

JVM 的 Hot Swap 功能比较弱,只能对修改方法体有效,例如新增加了一个方法,类等就无能为力了。有 2 个比较好用的热加载工具,JRebel 和 SpringLoaded,下图比较了对它们进行了比较(虽然看不懂日语,但是 o 越多肯定越强大,^_^)

下面用 Module Xbox 为例介绍怎么使用它们。

SpringLoaded

免费,只能使用 -javaagent 参数的方式启动项目,但是在 IDEA 里热加载后不能 Debug,因为没有相应的插件通知 IDEA 更新断点的信息,不过可以使用 IDEA 远程调试解决这个问题,具体细节在 IDEA + Maven + SpringLoaded 远程调试

使用 SpringLoaded
  1. 下载 SpringLoaded: https://github.com/spring-projects/spring-loaded
  2. 在启动参数里如图加上(-javaagent 后跟 SpringLoaded jar 包的地址):
    -javaagent:/Users/Biao/Baidu/workspace/springloaded-1.2.3.RELEASE.jar -noverify
  3. Debug 模式启动 Xbox

IDEA + Maven + SpringLoaded 远程调试

像上面一样在 IDEA 里启动项目 Xbox,虽然热加载能生效,但却不能 Debug,还是不够方便,通过远程调试就能客服这一缺点。

  1. 类 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: 不需要等待远程调试连接

  2. 使用 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

  3. IDEA 里远程调试


    输入 NameHostPort 点击 OK 按钮即可,其他的不用修改:

    点击 Remote-Xbox 就可以远程调试了

    在 IDEA 里打上断点看看效果,修改,添加,删除方法,断点也能生效了

JRebel

很贵,一年 $365,可以免费试用 14 天(过期后如果还想用,嘿嘿,把系统时间修改回来),使用 JRebel 插件启动项目,热加载后可以 Debug

注:如果 JRebel 使用 -javaagent 的方式启动项目,同样在热加载后不能 Debug,这时就和 SpringLoaded 一样了,还不如用 SpringLoaded。

使用 JRebel 插件
  1. 在 IDEA 的设置里找到 Plugins,点击 Browse repositories...
  2. 输入 jrebel 查找 JRebel 插件,安装 JRebel 插件,重启 IDEA
  3. 安装好 JRebel 插件后,在 IDEA 设置中就能看到 JRebel 了
  4. 从上图中可以看到 JRebel 还没有激活,点击 activate,在弹出的注册窗口里输入注册信息(邮箱必须是有效的邮箱地址,其它的随意填写),然后点击 Activate JRebel
  5. 注册成功,可以试用 14 天了
  6. Debug 模式启动 Xbox
  7. 修改代码,编译热加载后,仍然可以 Debug