【问题标题】:Automatically update jar files自动更新jar文件
【发布时间】:2010-08-23 06:41:33
【问题描述】:

我目前正在开发基于 java 的桌面软件。这是一个相当大的代码库(超过 40 个 jar 文件)。

我希望提供自动更新功能。桌面软件不断检查一个后端系统以查看是否有可用的新版本的 jar 文件。

现在的问题是:如何替换更新的jar文件?

【问题讨论】:

    标签: java auto-update


    【解决方案1】:

    如果您使用 Java Webstart (JNLP) 部署应用程序,您几乎可以免费获得这种机制...

    来自http://mindprod.com/jgloss/javawebstart.html

    Java Web Start 的主要优点是自动更新,无需每次都下载整个程序。

    【讨论】:

    • 根据经验,我建议 jar 在其文件名中包含版本。这会导致不同版本具有不同的 URL - 不同版本具有相同的 URL 有时会导致 jar 在本地缓存中未正确更新。
    • @Thorbjørn:除此之外,jar 中的版本号通常是一个好主意:使每个文件名唯一。
    • @Joachim,正如我所说,由于文件名不同,URL 也会不同。
    • @Thorbjørn:我知道,我同意。我只是想再次强调 jar 文件中的版本号是个好主意。出于您发布的原因还有其他原因。
    • 我试过了,它给出了很多与JVM相关的问题。很难排除故障。例如 - stackoverflow.com/questions/3584966/java-control-panel 对此有何建议?
    【解决方案2】:
    • 最简单的方法是在每次启动时检查更新,下载更新,然后启动您的应用程序。我认为这是 Java Web Start 的工作方式(参见 aioobes 答案)。

    • 更复杂的是为您的应用程序使用 netbeans 或 eclipse 框架。两者都相当复杂,您必须重写您的应用程序才能使用它们。此解决方案支持实时更新。

    据我所知,没有简单的方法可以更新正在运行的应用程序。可以使用不同的类加载器加载类的新版本,但不能在旧版本仍被引用时卸载它们。

    【讨论】:

      【解决方案3】:

      您可以制作一个小型服务器和一个启动器,用于下载最新版本、替换旧版本并使用以下命令启动 jar:

      Runtime.getRuntime().exec("java yourjar -jar");
      

      然后你终止启动器:

      System.exit(1)
      

      【讨论】:

        【解决方案4】:

        您还可以序列化您的状态(将其保存在内存中),然后创建一个指向新 .jar 文件的新 ClassLoader 实例。然后使用这个新的类加载器再次序列化你的状态。您刚刚更改了执行产品中的底层 .jar。

        请注意,您不需要仅为实际使用 .jar 文件的部分更改 everything 的类加载器。这可能很难得出结论是什么部分。如果操作不当,您可能会遇到令人讨厌的链接错误。所以..

        .. 为简单起见,请使用 WebStart 或更新 .jars 然后启动主应用程序的预加载器(基本上是 WebStart 为您所做的)。

        自己滚动的一个原因是,您可以使用自己的 .jar 格式、加密、其他打包格式等。

        【讨论】:

          【解决方案5】:

          在阅读了许多自动更新问题的答案后,我想到了一个解决方案。这就是我为 Java/Kotlin jar 应用程序实现 secure 自动更新的方式。

          假设:安装程序将包含两个 jar:启动器和主应用程序。创建的任何快捷方式都将指向启动器,但仍然是应用程序的名称。该版本将包含主应用程序和安装程序。

          启动器首先启动:

          1. 首先检查是否已将更新下载为app_name_update.jar
          2. 如果已下载更新,请将app_name_update.jar 重命名为app_name.jar
          3. 开始app_name.jar
          4. 这部分不必在启动器中,但最好不要减慢主应用程序的速度:此时,启动器应检查更新(例如 GitHub 发布 API)并将其下载到 {CWD}/unverified_app_name_update.jar .
          5. unverified_app_name_update.jar 的哈希值与包含所有已发布版本哈希值的在线位置进行比较。 hashes.txt 将是在同一个 github 存储库中找到的示例。如果软件是开源的,GPG 签名的提交是必须的,并且启动器应该检查最新的更新是否是经过验证的提交!如果它是专有应用程序,请将 hashes.txt 保留在与贵公司无法控制基础架构的版本(例如 GitHub)不同的 URL 中。

          主应用启动:

          • 除非强制更新,否则无需检查更新,在这种情况下检查更新 -> 如果找到更新,则开始加载动画“更新”,同时您可以检测到启动器仍在运行。确保启动器在循环时没有竞争条件!

          【讨论】:

            【解决方案6】:

            我找到了解决自动更新的现成项目。 您可以更新您的应用程序,在您的情况下,您可以更新桌面应用程序的 jar 和资源。接下来的想法是:用 starter 包装你的应用程序,它可以控制更新和运行你的应用程序。详情可以找here

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-09-20
              • 1970-01-01
              • 2010-12-12
              • 2018-02-17
              • 1970-01-01
              • 2022-10-07
              • 1970-01-01
              • 2015-11-01
              相关资源
              最近更新 更多