【问题标题】:Reload classes during JVM runtime在 JVM 运行时重新加载类
【发布时间】:2014-05-19 13:41:01
【问题描述】:

我知道有很多关于这个话题的问题。但它们主要是关于保留类和变量的状态。

我想让我的应用程序获取最新版本(全部打包在一个 jar 中)并自行重启。

我的应用程序使用 main() 函数作为起点,所以我只初始化一个类,整个应用程序就从那里开始。所以这让我思考。我可以在 main() 中停止整个应用程序。覆盖旧 jar,然后 JVM 理论上可以重新加载除包含 main() 的类之外的所有类,并且 main 将重新初始化所有内容并运行它。

这是不是太麻烦了?我是否应该只使用仅处理启动所述 jar 并下载它的最新版本的引导 jar。

【问题讨论】:

  • 引导 shell 脚本可能是最简单的。
  • 你想在运行时更改 jar 吗?并且不想重新启动 JVM?
  • 根据我的猜测,您至少需要 a) 主类和可重载类的不同 jar b) 仅在主类中使用反射 c) 很可能为可重载 jar 使用不同的 ClassLoader

标签: java class jvm classloader


【解决方案1】:

我会考虑使用 OSGi 容器。这里有许多轻量级、低开销的实现,例如 Apache FelixEclipse Equinox。许多 Java 应用程序服务器构建在 OSGi 内核之上。 它允许您在运行时轻松地热交换整个 jar(包)甚至更细粒度的单元(功能),几乎不费吹灰之力。

【讨论】:

    【解决方案2】:

    在几乎总是自动更新的大多数商业 Java 应用程序中,总是有一个引导应用程序来控制主应用程序的执行。我相信这方面也有很多例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 2010-10-19
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      相关资源
      最近更新 更多