我有一个更新程序,它将下载.jar文件 - 如果它是新文件,然后退出应用程序,然后用更新的文件替换.jar文件,然后用户将能够执行该更新版本?< / p>
我该怎么做?
答案 0 :(得分:0)
我猜你在使用当前正在覆盖文件时遇到问题?这在很大程度上取决于操作系统:在Windows上,Java会锁定当前正在使用的所有jar文件,因此无法覆盖。在Linux上,可能会覆盖,但由于Java没有将整个文件复制到RAM中,因此可能会发生代码在某个阶段失败,因为不再可能从文件中加载新类(这很可能发生在AskShutdownDialog类的示例,仅在关闭时使用)。我不了解MacOS,但我认为即使尝试它也不是一个好主意。
有很多技巧可以解决这个问题:
您可以使用帮助应用程序:使用java -jar updatehelper.jar
调用启动它,然后退出主应用程序。 UpdateHelper将等待您的应用程序退出,然后替换文件(您之前下载并验证过的文件)并使用另一个Java调用再次启动主应用程序。
您也可以使用命令行脚本作为帮助程序,但至少在Windows上,开发起来不是很容易,而且需要特定于操作系统的脚本
这两个选项都需要一些特定于操作系统的代码,至少要找到你的java二进制文件来重新启动主应用程序。这可能会导致(不仅仅是)未经测试的操作系统出现问题
完全不同的方法是实现Loader。这是一个小jar文件,不会长时间改变。这个Loader可以尝试找到你当前的版本,例如从配置文件加载主jar的名称,比如:MyMain-1.01.jar(最好将整个类路径保存在这个文件中,并指定名称主类,你还需要一个自己的类加载器)。然后它加载此文件并调用其中的真正主类。使用此设置,您不需要任何os依赖代码,但您需要知道您的Loader将始终至少在Windows中被锁定。但即便如此,您仍然可以选择在较新版本的应用程序中引入UpdateHelper。 我曾经使用过这个选项,并且有一个非常稳定的更新概念。加载程序显示带有进度条的闪屏,并直接从Web服务器下载更新。如果你想要这样的话,你也应该考虑使用Java WebStart
还有热部署选项,这意味着您可以在运行时卸载jar文件。但这需要非常模块化的应用程序设计,并且模块之间没有硬引用。这是应用程序服务器和Web服务器的领域,如Tomcat,Jetty,JBoss等,它们使用单独的类加载器。从头开始实现这一点并不容易。