如何在同一个JVM中启动外部jar并仍然能够终止当前的main()

时间:2013-07-20 01:09:05

标签: java jar external wrapper terminate

我对Java特别陌生,因此我的问题可能是全部BS,但我面临着为现有Java应用程序创建Updater Wrapper(Java应用程序)的挑战,其中我无法理解..我面临的问题是,每次我们必须启动一个新jar时,我们不想启动第二个和第三个JVM,但步骤5)的终止被更新程序的线程阻止,它是从Updater.jar的Classloader开始的。

概念:

  1. 触发当前版本的应用以检查更新
  2. 启动Updater.jar
  3. OnUpdateAvailable - >关闭传入连接并保存应用程序状态及其对象
  4. 在套接字
  5. 上向Readyater发送ReadyForUpdate信号
  6. 当前申请终止。
  7. Updater替换Application可执行文件和资源
  8. Updater启动新版Application.jar,其参数为恢复到之前的状态
  9. 更新程序等待应用程序 - >成功初始化
  10. 更新程序终止
  11. 新版应用程序已启动并正在运行
  12. 问题:有没有办法使用相同的虚拟机首先启动更新程序,然后从更新程序启动应用程序的新版本,还是应该继续使用单独的JVM?

    java版本:1.7.0_05-icedtea OpenJDK 64位服务器VM(版本23.0-b21,混合模式)

1 个答案:

答案 0 :(得分:0)

我认为使用单独的虚拟机和包装脚本执行此操作要简单得多。

您在第5步遇到的问题是,它需要应用程序“关闭”而不调用System.exit并且不运行关闭挂钩:

  • 可能需要对您的应用程序代码库进行重大的重新设计。

  • 即使你已经这样做了,你仍然会遇到这样的问题:旧的应用程序状态很可能通过使用旧的类加载器加载的对象“延迟”。摆脱这一点可能非常困难。如果你不这样做:

    • 你有一个permgen泄漏,
    • 您可能有非permgen内存泄漏(例如,通过已更换的类中的静态),
    • 您可能会泄漏可能导致“重新启动”应用程序出现问题的应用程序状态。