Jetty 热代码部署

Hot code deployment in Jetty

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

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

我知道网络应用程序有自己的 class 加载程序以符合 servlet 规范,但我不介意冒非标准行为的风险,以便在开发过程中更快地部署更改。我尝试使用 WebAppContext.setClassLoader 将 classloader 设置为 "normal" classloader 但无济于事。

是否可以如我所愿?我相信 JRebel 声称会这样做,但它在做什么而我不是?

如果您使用 remote debug from Eclipse, Hot code replace 连接到 Jetty 应该是可能的。

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

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

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

基本上你的选择是:

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