我有一个 jpackage 创建的应用程序,它由单个应用程序 jar 文件和一些第三方依赖项组成。我使用 jpackage 创建适用于 Linux、macOS 和 Windows 的安装程序。一切正常。
但我不希望我的用户每次应用程序更改时都必须重新安装应用程序,因此我正在寻找一种方法让用户下载应用程序 jar 并替换安装程序中包含的应用程序 jar。
我认为最好的选择是将应用程序 jar 下载到 $HOME/application_name/ 目录中,并将已安装应用程序的 CLASSPATH 设置为以该目录开头,以便它在出现的 jar 之前找到新更新的 jar随着安装。这可能吗?如果是这样,怎么办?我在 jpackage 文档中找不到任何表明该功能存在的内容。或者,是否可以直接从应用程序内替换已安装的应用程序 jar?如果是的话,怎么办?
如果两者都不可行,还有其他方法吗?在关于同一件事的 2 岁以上问题中,唯一的答案建议使用 JWS 替代品“getdown”,但我不想走这条路,因为我会失去 jpackage 的其他好处。
“不要修复未损坏的东西。” -伯特·兰斯
你有什么理由使用jpackage吗?因为您可以通过我为每个桌面应用程序使用的技术来充分利用它,JDeploy:
jDeploy 是 Java 开发人员可以更轻松地将桌面应用程序作为本机捆绑包分发的工具。您可以使用 npm 或 GitHub 版本将应用程序发布到云,它提供了一个下载页面,其中包含下载适用于 Mac、Windows 和 Linux 的本机捆绑包的链接。有关 jDeploy 及其功能的更多信息,请参阅 jDeploy 网站。
他们的网站:
[https://www.jdeploy.com/][JDeploy site]
完全按照本文档的说明进行操作可以让您实现您的目标:
[https://www.jdeploy.com/docs/manual/][JDeploy developers guide]
如果您有任何疑问,请告诉我!
jpackage 本身不直接支持就地更新 jpackage 应用程序。然而,你考虑更新它的方式是相当合理的,并且可以通过一点创造力来实现。以下是可能适合您的方法:
分步方法:
1。应用程序目录创建
2。检查是否有较新的 JAR:
3.更新机制:
在您的应用程序中实现简单的更新机制:
4。设置类加载器:
这是在代码中执行此操作的基本方法:
File jarUpdateFolder = new File(System.getProperty("user.home") + "/application_name/");
URL[] urls = {jarUpdateFolder.toURI().toURL()};
URLClassLoader loader = new URLClassLoader(urls);
Class<?> clazz = loader.loadClass("com.your.main.ClassName");
Method main = clazz.getDeclaredMethod("main", String[].class);
String[] args = {}; // or whatever args you need
main.invoke(null, (Object) args);
5。用户通知:
6。后备机制:
注意事项:
安全性:确保您签署并验证您的 JAR,以便恶意用户无法用有害代码替换 JAR。
权限:在某些系统上,您可能会遇到权限问题,特别是当您的应用程序需要提升权限时。确保应用程序具有下载和替换 JAR 文件所需的权限。
备份:建议保留旧 JAR 的备份。如果新的 JAR 出现重大问题,用户可以回滚。
日志记录和调试:保留全面的日志,尤其是在更新过程中。它将有助于调试更新过程中可能出现的问题。
局限性:这种方法本质上绕过了 jpackage 来更新应用程序,因此您无法获得 jpackage 可能为此过程提供的任何固有好处。
虽然此方法涉及手动设置并且需要仔细考虑不同的边缘情况,但它为您提供了所需的灵活性,而无需等待 jpackage 提供此类功能。