【问题标题】:Hot code deployment in JettyJetty 中的热代码部署
【发布时间】:2015-09-01 10:28:28
【问题描述】:

我正在编写一个 Java EE 应用程序,使用 Jetty 作为应用服务器以方便开发。尽管(重新)部署很快,但我希望 Java 代码更改可以立即反映在正在运行的服务器中而无需重新启动。 (我已经在使用 useFileMappedBuffer 设置来查看静态服务内容的即时更改)。

我已经看到有关使用 Maven Jetty 插件和设置 scanInterval 以重新部署 Web 上下文的问题,但这不是我想要做的。我的 Jetty 服务器是从 Eclipse 中的 Java 应用程序中启动的,我希望代码更改能够立即反映在正在运行的服务器中,就像 Eclipse 中的普通 Java 应用程序一样。我正在“就地”运行代码,即没有先构建和部署 WAR 文件。

我意识到 Web 应用程序有自己的类加载器以符合 servlet 规范,但我不介意冒着非标准行为的风险以在开发中更快地部署更改。我尝试使用WebAppContext.setClassLoader 将类加载器设置为“普通”类加载器,但无济于事。

有可能做我想做的事吗?我相信 JRebel 声称会这样做,但我不是在做什么呢?

【问题讨论】:

    标签: java deployment jetty


    【解决方案1】:

    如果您使用 Eclipse 中的 remote debug 连接到 Jetty,则应该可以使用 Hot code replace

    通过向 Jetty 启动脚本添加以下内容来启用远程调试:

    -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787
    

    【讨论】:

    • 我刚刚发现在调试模式下启动我的应用程序(甚至不是远程调试)会启用热代码替换。我想这是因为我在我的应用程序中运行 Jetty。非常感谢。
    • @PeterSwords 要理解的是它是 JVM 的一个特性,而不是 Jetty 或 IDE。如果 JVM 以带有 -Xdebug 标志的调试模式启动,则启用热交换。可能你已经知道了,但我只是跟进以确保:)
    • 请注意,即使使用 -Xdebug 和 hotswapping,这种行为的用处也有限,因为核心类库中有很多(太多)位置缓存值、对象、实例、对原始的预交换状态。因此,如果您的行为异常,只需重新启动您的 Web 应用即可。
    • @Gimby -- 是的,只是大脑冻结。我知道类重载是一个 JVM 特性,只是忘记了它只在调试运行时才有效。我以为 Jetty 正在做些什么来打败它,但事实并非如此。我理解这些限制,但是当我对自己的课程进行细微调整时,我仍然觉得它很有用。无论如何,Jetty 重新启动的速度都非常快,这就是为什么我使用它而不是我最终的目标应用服务器的原因,但随着应用程序的增长可能会变慢。
    【解决方案2】:

    即使是普通的 Java 应用程序也需要重新启动才能看到代码更改。

    基本上你的选择是:

    1. 重启 Jetty(你说过你不想要那个)。
    2. 让 Jetty 扫描应用程序更改并在检测到更改时允许热重新部署(您说过您不希望这样做)。
    3. 附加一个远程调试器,然后热交换您的代码更改(参见 Amila 的回答)。这仅限于方法主体的更改,因此并不是真正有用。
    4. 使用 JRebel,它提供了有用的热插拔实现,还可以为许多框架选择配置更改。
    5. 使用基于一次性类加载器(例如TapestryCivilian)实现专有热交换实现的网络框架。

    【讨论】:

      猜你喜欢
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2012-05-06
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      相关资源
      最近更新 更多