【发布时间】:2010-08-23 06:41:33
【问题描述】:
我目前正在开发基于 java 的桌面软件。这是一个相当大的代码库(超过 40 个 jar 文件)。
我希望提供自动更新功能。桌面软件不断检查一个后端系统以查看是否有可用的新版本的 jar 文件。
现在的问题是:如何替换更新的jar文件?
【问题讨论】:
标签: java auto-update
我目前正在开发基于 java 的桌面软件。这是一个相当大的代码库(超过 40 个 jar 文件)。
我希望提供自动更新功能。桌面软件不断检查一个后端系统以查看是否有可用的新版本的 jar 文件。
现在的问题是:如何替换更新的jar文件?
【问题讨论】:
标签: java auto-update
如果您使用 Java Webstart (JNLP) 部署应用程序,您几乎可以免费获得这种机制...
来自http://mindprod.com/jgloss/javawebstart.html
Java Web Start 的主要优点是自动更新,无需每次都下载整个程序。
【讨论】:
最简单的方法是在每次启动时检查更新,下载更新,然后启动您的应用程序。我认为这是 Java Web Start 的工作方式(参见 aioobes 答案)。
更复杂的是为您的应用程序使用 netbeans 或 eclipse 框架。两者都相当复杂,您必须重写您的应用程序才能使用它们。此解决方案支持实时更新。
据我所知,没有简单的方法可以更新正在运行的应用程序。可以使用不同的类加载器加载类的新版本,但不能在旧版本仍被引用时卸载它们。
【讨论】:
您可以制作一个小型服务器和一个启动器,用于下载最新版本、替换旧版本并使用以下命令启动 jar:
Runtime.getRuntime().exec("java yourjar -jar");
然后你终止启动器:
System.exit(1)
【讨论】:
您还可以序列化您的状态(将其保存在内存中),然后创建一个指向新 .jar 文件的新 ClassLoader 实例。然后使用这个新的类加载器再次序列化你的状态。您刚刚更改了执行产品中的底层 .jar。
请注意,您不需要仅为实际使用 .jar 文件的部分更改 everything 的类加载器。这可能很难得出结论是什么部分。如果操作不当,您可能会遇到令人讨厌的链接错误。所以..
.. 为简单起见,请使用 WebStart 或更新 .jars 然后启动主应用程序的预加载器(基本上是 WebStart 为您所做的)。
自己滚动的一个原因是,您可以使用自己的 .jar 格式、加密、其他打包格式等。
【讨论】:
在阅读了许多自动更新问题的答案后,我想到了一个解决方案。这就是我为 Java/Kotlin jar 应用程序实现 secure 自动更新的方式。
假设:安装程序将包含两个 jar:启动器和主应用程序。创建的任何快捷方式都将指向启动器,但仍然是应用程序的名称。该版本将包含主应用程序和安装程序。
启动器首先启动:
app_name_update.jar
app_name_update.jar 重命名为app_name.jar
app_name.jar
{CWD}/unverified_app_name_update.jar .unverified_app_name_update.jar 的哈希值与包含所有已发布版本哈希值的在线位置进行比较。 hashes.txt 将是在同一个 github 存储库中找到的示例。如果软件是开源的,GPG 签名的提交是必须的,并且启动器应该检查最新的更新是否是经过验证的提交!如果它是专有应用程序,请将 hashes.txt 保留在与贵公司无法控制基础架构的版本(例如 GitHub)不同的 URL 中。主应用启动:
【讨论】:
我找到了解决自动更新的现成项目。 您可以更新您的应用程序,在您的情况下,您可以更新桌面应用程序的 jar 和资源。接下来的想法是:用 starter 包装你的应用程序,它可以控制更新和运行你的应用程序。详情可以找here。
【讨论】: