自动更新程序

7
所以,这是我心中长久以来一直在思考的问题。如何使一个程序‘自动更新’。假设有一个外壳,它会检查Myserver.com/myProg/updates.xml(或其他资源),并确保版本号相同。那么,我该如何处理程序的更新呢?
假设我的程序只是一个简单地带有主类的程序,唯一的输出就是:
System.out.println("Hello World");
在更新后,它变成了System.out.println("Hello Java");
我应该如何在运行时实现这个更改?
注意:由于签名问题,JNLP不适用于此问题。

1
我不确定我理解你的问题。当你检测到一个新版本时,你会下载新的代码并运行新的代码而不是旧的代码。 - Greg Hewgill
可能是["Automatic updates" for Java (desktop) application?]的重复问题。(https://dev59.com/XXVC5IYBdhLWcg3wZwTj) - Kiril
我的问题是:我如何在运行时下载这些新的位并替换旧的位? - A_Elric
@Lirik - 远远不行,我说过JNLP不是一个选项。 - A_Elric
Install4j似乎有2000美元的许可费。 - A_Elric
显示剩余2条评论
2个回答

9
你需要两个“应用程序”:
1. 一个最小的引导应用程序,检查更新并运行主应用程序; 2. 主要应用程序。
用户始终启动引导应用程序,而不是主应用程序(实际上用户不知道引导应用程序)。这是我见过的最常见的模式。
如果您想在运行时进行自动更新,您将需要使用javabeats提到的OSGI。但只有在您真正需要时才选择这种方法。我从未使用过OSGI,但我可以想象它非常复杂。
编辑
我没有具体的示例,但我可以想象:
1. 引导程序下载一些jar和配置文件; 2. 其中一个配置文件包含类路径中所需的文件(如果您的应用程序挑选给定文件夹中的所有jar文件,则可以自动执行此操作); 3. 使用上述列表创建新的类加载器(请参见此处的示例),添加jar文件到类路径。 4. 在新的类加载器中运行应用程序的主类。
抱歉,我不能为您提供更详细的答案,因为那需要我编写代码:)。

1
自动更新运行时几乎从来不是任何非平凡应用程序的好主意。存在太多导致状态异常的方式。重启主应用程序总是更好的选择。 - jtahlborn
我完全同意你的观点。我认为在基于插件/微内核的应用程序中更容易实现(我以Jenkins为例)。而对于更复杂的应用程序则需要重新启动。 - Augusto
你能举个例子展示如何让它工作吗? 我想要通过命令行参数从引导程序中运行java -jar myJar.jar,但肯定有更优雅的方式,是吧? - A_Elric
2
你也可以使用ProcessBuilder来启动一个新的操作系统进程,并在此之后让引导应用程序正常退出。http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html - javabeats

2
如果排除JNLP,我认为只有使用OSGI才能实现这一点。否则,即使在最简单的设计中,您也需要另一个程序来管理和下载当前程序的版本。

你不需要OSGI,只需两个程序。 - jtahlborn
这也是我的选择,但我遵循了问题的要求。 - javabeats

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接