我有以下项目结构
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时
答案 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代理似乎会附加到错误的进程。