JRebel不会在intellij

时间:2018-01-08 21:59:18

标签: java intellij-idea gradle jrebel

我有以下项目结构

project-root
--core
---build.gradle
---project.gradle
--web
---build.gradle
---project.gradle

我将jRebel配置为使用gradle运行,因此我可以使用命令gradle tomcatRun启动我的嵌入式tomcat 8

这显示了jrebel的日志输出,我的应用程序在嵌入式服务器上启动,但是当我更改java文件时没有热部署。

使用IntelliJ JRebel插件,我为每个项目项目 - 根,核心和Web创建了rebel.xml文件。我还在web项目web / build / classes / main中的web项目中添加了一个rebel.xml,如here所述

通常jrebel应该在启动时显示它的wachting一些文件夹,但在我的网站上并非如此,所以我想我的配置有问题

这里是rebel.xml文件

project-root (路径c:/project-root/rebel.xml)

     <?xml xsd....">
        <classpath>
            <dir name="c:/project-root/out/production/classes">
            </dir>
        </classpath>
     </application>

核心(路径c:/project-root/core/src/main/resources/rebel.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <application generated-by="intellij" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://update.zeroturnaround.com/jrebel/rebel-2_1.xsd">
        <classpath>
            <dir name="c:/project-root/core/out/production/resources">
            </dir>
            <dir name="c:/project-root/core/out/production/classes">
            </dir>
        </classpath>
    </application>

网络(路径c:/project-root/web/src/main/resources/rebel.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <application generated-by="intellij" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://update.zeroturnaround.com/jrebel/rebel-2_1.xsd">
    <classpath>
        <dir name="c:/project-root/web/out/production/classes">
        </dir>
    </classpath>
    </application>

网络(路径c:/project-root/web/build/classes/main/rebel.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com"
                xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd">
    <classpath>
        <dir name="c:/project-root/web/build/classes/main">
        </dir>
    </classpath>
    <web>
        <link target="/">
            <dir name="c:/project-root/web/src/main/webapp">
            </dir>
        </link>
    </web>
    </application>

要将jrebel附加到我的gradle,我在开始gradle tomcatRun之前进行了以下批量调用

set REBEL_HOME=C:\Users\myuser\.IdeaIC2017.3\config\plugins\jr-ide-idea\lib\jrebel6
set JAVA_OPTS="-agentpath:%REBEL_HOME%\lib\jrebel64.dll"

然后调用gradlew tomcatRun启动tomcat和jrebel

    gradlew tomcatRun
    2018-01-09 10:24:09 JRebel:  Starting logging to file: C:\Users\myuser\.jrebel\jrebel.log
    2018-01-09 10:24:09 JRebel:
    2018-01-09 10:24:09 JRebel:  #############################################################
    2018-01-09 10:24:09 JRebel:
    2018-01-09 10:24:09 JRebel:  JRebel Agent 7.1.3 (201711301108)
    2018-01-09 10:24:09 JRebel:  (c) Copyright ZeroTurnaround AS, Estonia, Tartu.
    2018-01-09 10:24:09 JRebel:
    2018-01-09 10:24:09 JRebel:  Over the last 2 days JRebel prevented
    2018-01-09 10:24:09 JRebel:  at least 0 redeploys/restarts saving you about 0 hours.

但是当我更改一些源文件时,jrebel没有检测到任何内容,当我手动调用gradlew compileJava时

2 个答案:

答案 0 :(得分:2)

我认为问题在于JRebel没有附加到运行嵌入式Tomcat服务器的实际进程。相反,它附加到Gradle的包装过程。尝试通过org.gradle.jvmargs选项附加JRebel的JVM参数。

gradle tomcatRun -Dorg.gradle.jvmargs="-agentpath:/path/to/jrebel/lib/libjrebel64.so"

此外,由于tomcatRun任务使用了爆炸式部署,因此不需要 rebel.xml 文件。这是因为构建输出目录与部署目录相同,并且该目录中所做的更改将由JRebel自动获取并重新加载。

确保还使用gradle compileJava命令编译您所做的更改。

我个人试了一下,看起来效果很好。虽然它不会将JRebel横幅输出到控制台输出,但它会在重新加载类文件时通知您。

答案 1 :(得分:0)

虽然Tiit的回答是正确的,但我想补充一点,当使用Gretty时,你需要指定 -agentpath:/path/to/jrebel/lib/libjrebel64.so build.gradle 文件中的em>参数如下:

gretty {
  . . .
  jvmArgs = [
    '-agentpath:/path/to/jrebel/lib/libjrebel64.so'
  ]
}

否则,通过使用 -Dorg.gradle.jvmargs 选项,当使用Gretty启动器时,JRebel代理似乎会附加到错误的进程。