“热代码替换”不起作用-- Eclipse不会更改JBoss上的任何代码

rqdpfwrv  于 2022-11-08  发布在  Eclipse
关注(0)|答案(5)|浏览(263)

我目前遇到了一个问题,“热代码替换”不工作的Eclipse伽利略和JBoss 4.2.3。
在其他应用程序中,我在本地JBoss上运行了一个展开的Java WAR。构建它的项目由Maven管理。我使用Maven目标war:explotted构建项目,然后使用ANT脚本将该目录复制到JBoss。
当我现在运行应用程序并在代码中的任意位置设置断点时,Eclipse会在调试模式下正确地在该行处停止。但是当我对源文件进行更改并保存它时,Eclipse不会将此更改应用到JBoss。例如,当我将一个普通的代码行转换为注解时,调试器仍然会跳过此注解,就像它是普通的Java代码一样。或者当我删除一行代码时,调试器似乎与文件不同步并开始跳过括号。
但是我也没有收到任何“热代码替换错误”的消息。在我看来,Eclipse将更改应用到了源文件,但没有将其应用到JBoss。
为了使热代码替换工作,是否必须打开任何特殊的首选项?或者在如何构建应用程序并将其部署到JBoss中时是否存在任何错误?

sf6xfgos

sf6xfgos1#

我没有使用过JBoss,但我有两个建议。
1.如果使用启动配置在eclipse中运行应用程序,
是否启用了“项目”-“自动生成”标志?如果未启用,则在运行时不会编译代码并忽略代码。
1.当你在远程模式下调试一个应用程序时,你不能改变代码,但是你可以改变参数的值。(我认为)

idfiyjo8

idfiyjo82#

我在使用Maven和Eclipse的一个项目中遇到了问题。没有显示错误,但是热代码替换不起作用。我读到“自动构建”必须被选中。我检查了这个,它仍然不起作用。我在构建路径中的其他项目中遇到了一些错误。我相信这就是错误。当我研究时,我发现我们不得不取消选中“当生成路径错误时中止生成”。我在下面的链接中给出了细节。

up9lanfz

up9lanfz3#

我在Open Liberty上也遇到过类似的问题,让我在已被接受的答案加上@user513365的答案(因为那里的一个链接已经失效了)的基础上继续。
我有两个问题:

1.构建路径错误

在我的例子中,我的不完整的构建路径是因为我使用的Maven项目只有src/main/java,但没有src/test/java(所以可能可以通过创建后者来解决这个问题)。
但是我能够通过进入 * 首选项-〉Java -〉编译器-〉构建 * 并进行以下两个更改之一来修复热代码替换:
可以是:
1.取消选中发生生成路径错误时中止生成
1.使用下拉列表,将不完整的构建路径Error更改为Warning

2.确保Eclipse构建的类已加载

在我的例子中,我的远程JVM使用的是本地.m2 Maven资源库中的一个完整JAR工件。“项目”-“自动构建”在这里遗漏了一个微妙之处。
在我的例子中,如果我在连接调试器之后构建Eclipse,Eclipse项目构建只会进行热代码替换。是的,它会自动构建Eclipse,但是如果我重新启动我的远程JVM并简单地连接调试器,它仍然被配置为从我的本地.m2 JAR加载这个类,而不是拾取我的本地更改。

关于此答案与其他答案的最后说明

如果您经常更改自动构建的类,您可能不会注意到第2点中的微妙之处,而您所需要的只是可接受的答案以及@user513365的答案中提到的构建路径错误。

cygmwpex

cygmwpex4#

第一个检查是项目/自动构建。
可能还需要检查应用服务器部署配置、
例如,对于JBoss,在Eclipse的“服务器”视图中,双击服务器,将出现一个“部署扫描器”部分,其中包含两个复选框:

  • 添加缺少的部署扫描程序
  • 关闭前删除添加的部署扫描程序

https://docs.jboss.org/author/display/AS7/Deployment+Scanner+configurationJBoss AS/ Deployment Scanner configuration显示器

unguejic

unguejic5#

我最近在Eclipse 2019-06中遇到了这个问题,我发现我不得不取消选中Preferences-〉Java-〉Debug-〉Hot Code Replace组中的“Replace classfiles containing compilation errors”选项。所有其他选项都被选中了。在这样做之前,我得到了 “Hot code replace failed - Delete method not implemented”,尽管我唯一的改变是分配了一个System. out。println调用。我一更改选项(在同一调试会话中),它就开始为我工作了。

相关问题