简而言之,您将如何设计一个支持简单可靠的自动更新的应用程序?
我对如何切割它以及所涉及的各种操作很感兴趣。
编辑:这与这个问题有关:自毁应用程序
需要处理的问题:
如果进行更新的应用程序本身正在更新,则需要重新启动,或者需要执行存根将文件移动到位(以避免文件使用中的错误。)
无论您通过网络请求与之通信以检索文件的任何服务都需要知道您正在运行的已安装包的当前版本。它将动态构建文件 URL 列表,甚至可能压缩文件并将其放在客户端的单个 URL 中。否则,让客户端遍历 URL 列表,拉取每个文件。每个 URL 都将与一个操作相关联,例如“复制”或“执行”。
处理每个检索到的文件并将其安装到客户端。
更新需要是原子的(如果操作的任何部分失败,则能够回滚。)您不希望处于部分状态。
Java 网络启动协议在简化自动更新软件的部署方面做得很好。该站点上的一些人报告了它的问题,但这可能是由于使用旧版本的 Java 或未正确设置 JNLP 文件。我发现它在 Mac 和 Windows 以及工作中的 PC 上运行良好,无需以管理员身份登录,我能够有效地“安装”我的软件。从用户的角度来看,就像我给了她一个新的桌面应用程序一样。桌面上有一个程序图标,我的程序保存的文件与之相关联 - Windows 为它们提供正确的图标,当您双击它们时它们会打开。但是每次她运行程序时,JNLP 首先检查她本地存储的 JAR 文件与我服务器上的内容,以及她的文件是否比我服务器上的文件旧,软件得到更新。这些程序的启动速度仍然与本机 Windows 应用程序一样快,除了第一次必须下载所有内容。
现在要使程序自毁,这里有两个选项:
将服务器上的 jar 文件更改为简短无用。用户启动程序,它会更新,然后他们会看到一个对话框,告诉他们该程序不再可用。您也可以通过这种方式禁用功能。但这会立即影响所有用户。您可以创建几个不同的 JNLP 文件,每个文件用于具有相同时间线的不同类别的用户,以使您的应用程序能够运行,您甚至可以让服务生成 JNLP 文件。但是禁用它的控件仍然来自您更改服务器上的 jar。
当程序启动时,它首先联系 Web 服务以验证程序是否应该仍在运行。您可以创建一个数据库表,将您的用户与他们现在可以使用的功能相关联。如果您的用户没有注册,您将需要在他们第一次运行程序时以某种方式为他们创建一个 id,将其放在 db 表上并使用首选项 api 将其存储在客户端计算机上。
如果您不熟悉使用 JNLP 自动更新,这里有一些背景知识可以帮助您入门:
JNLP 文件是一个 XML 文件,它描述了您的应用程序在线存储的位置以及它需要运行哪些 JAR 文件。还指定了应用程序的各种属性,例如启动画面、桌面图标、更新样式(总是询问、不提示就更新、在后台更新)以及与程序关联的文件。
阅读 JNLP 开发人员指南以获取有关如何使其工作的详细说明。
您还可以在线查看大量示例。在 Chrome 中,JNLP 文件的默认行为只是保存它,在其他浏览器中,您可能需要右键单击并另存为,但这仅适用于文件的直接链接而不是花哨的 javascript 按钮。然后,您可以在您喜欢的文本编辑器中打开 JNLP 文件作为示例。
swing 教程使用 JNLP 文件来演示代码。