【问题标题】:Swapping a running jar at runtime在运行时交换正在运行的 jar
【发布时间】:2011-04-06 23:54:43
【问题描述】:

我正在构建一个更新系统,我需要能够在运行时替换一个正在运行的应用程序 jar 的引用 jar。但是,当我尝试在 jar 上执行文件实用程序功能(例如“setLastModified”)时,我在 Windows 上遇到了文件锁定问题。

经过一番谷歌搜索后,我发现了这个 sn-p...

我在研究中发现 标准类加载器 实现 从不 关闭一个 jar 文件一旦打开。它也是 只从 jar 文件中加载资源 如所须。所以在任何特定的时间, jar文件中可能有类 尚未加载到内存中。 显然,如果你删除jar文件 从 ClassLoader 下出来,它 试图在 丢失文件,你会得到一个 至少IOException。

有没有人可以参考有关执行此操作或解决此问题的信息?

谢谢。

【问题讨论】:

  • 你需要重新发明轮子吗? OSGi 已经进行了热部署。看看你是否可以使用它。
  • OSGi 对于大多数要求来说听起来像是压倒性的,看看这个答案stackoverflow.com/a/2463978/320594
  • 重新阅读后,您似乎希望使用新的 jar 来保持应用程序运行......所以 OSGi 看起来确实是一个很好的解决方案 :),例如 Eclipse 允许这样做(插件重新加载,而运行)并为此使用 OSGi(据我所知)。

标签: java file plugins jar locking


【解决方案1】:

classes/lib 热交换有很多解决方案:

这取决于你想做什么。

【讨论】:

  • OSGi 非常庞大,而 JRebel 仅用于开发,因为它需要昂贵的许可证(对于 OSS 项目免费)。不确定 Ant 的 Hotswap
【解决方案2】:

最接近的是OSGi

请查看上述文章的“另见”部分,了解具体产品。

【讨论】:

    【解决方案3】:

    我不知道有什么好的方法来处理这个问题。创建自定义类加载器可能是一种选择,尽管我不喜欢这个想法..

    我们通过在启动主应用程序之前从单独的 jar 运行更新程序来解决这个问题。这很好用,但显然,您只能在应用程序启动时更新 jar。

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多