【问题标题】:How to hotswap Java classes on a Tomcat outside the IDE with dcevm+hotswapagent如何使用 dcevm+hotswapagent 在 IDE 外的 Tomcat 上热交换 Java 类
【发布时间】:2017-06-12 21:03:51
【问题描述】:

我正在尝试在我机器上的 Tomcat 上设置 java 类热交换,但 没有 在我的 IDE (Eclipse) 中配置。在所有示例中,我都可以找到 Tomcat 服务器在 Eclipse 中运行。是否可以在外部 tomcat 上使用 DCEVM+HotSwapAgent 进行代码热交换?这是我到目前为止所做的:

  1. 将 DCEVM 设置为 jdk1.8.0_112 的 altjvm,使用 DCEVM-light-8u112-installer.jar
  2. 更新了 Tomcat 的启动以包含以下内容:set JAVA_OPTS=-XXaltjvm=dcevm -javaagent:<path-to>hotswap-agent-1.0.jar %JAVA_OPTS%
  3. 部署了我的应用程序war,其中在WEB-INF/classes 中包含一个hotswap-agent.properties

在我的hotswap-agent.properties 文件中,我已将extraClasspath 属性设置为我Eclipse 工作区中项目的bin 文件夹。我还设置了autoHotswap=true(无论是否附加调试器,我都希望进行代码热插拔)。

使用此设置,当我在 Eclipse 中构建(它设置为自动构建)时,我无法让 Tomcat 对更改做出反应。我错过了一些东西来让它工作吗?

旁注 - 我已经用 JRebel 完成了与上述完全相同的事情,所以我知道这至少是可能的。我只是想看看我是否可以让它与所有开源工具一起使用。提前致谢!

【问题讨论】:

  • 我应该提到我还打开了日志记录,我在agent.log 中看到这样的行:HOTSWAP AGENT: 15:25:10.348 DEBUG (org.hotswap.agent.util.classloader.URLClassLoaderHelper ) - 将 extraClassPath URL [file://] 添加到 classLoader sun.misc.Launcher$AppClassLoader@18b4aac2。我在日志中没有看到任何错误...

标签: java tomcat8 dcevm hotswapagent


【解决方案1】:

这是可能的。请检查您是否正确设置了extraClasspath - 编译一个文件(检查是否在 extraClasspath 上创建了新版本的 .class 文件)并在不部署新 WAR 的情况下重新启动 tomcat。如果未应用更改,则说明 extraClasspath 设置不正确。

DEBUG 级别还应提供有关 rousources 的更多详细信息 - 应该有类似于 Registering resource listener on classpath URI {} 的行

请下载当前的 HA 版本。

【讨论】:

    【解决方案2】:

    您可以在 conf/Catalina/localhost 下为您的上下文创建一个文件,并在您使用 Eclipse Build Automatically 更改类时让 Tomcat 重新加载您的类。

    对于 Tomcat 8.5,your_project.xml 文件看起来像,对于其他版本的 Tomcat,请查看文档,因为它可能略有不同。

    <Context docBase="/eclipse-workspace/your_project/src/main/webapp">
    <Resources>
        <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                       base="/eclipse-workspace/your_project/target/classes" internalPath="/" webAppMount="/WEB-INF/classes" />
        <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                       base="/eclipse-workspace/your_other_project/target/classes" internalPath="/" webAppMount="/WEB-INF/classes" />
        <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                       base="/eclipse-workspace/your_external_libs" internalPath="/" webAppMount="/WEB-INF/lib" />
      </Resources>
    </Context>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      相关资源
      最近更新 更多