【问题标题】:Self Updating Program [closed]自我更新程序[关闭]
【发布时间】:2012-11-01 05:37:56
【问题描述】:

所以,这是我想了很久的事情。您如何获取程序并使其“自动更新”。因此,假设一个外壳检查 Myserver.com/myProg/updates.xml(或其他一些资源)并检查以确保版本号相同。一旦我这样做了,我该如何处理更新程序?

假设我的程序是一个简单的主类,唯一的输出是:

System.out.println("Hello World");在更新时它变成 System.out.println("Hello Java");

我怎样才能在运行时使这种更改到位?

注意:JNLP 不适用于此,因为我不想扩展的签名问题。

【问题讨论】:

标签: java auto-update


【解决方案1】:

您需要 2 个“应用程序”:

  1. 检查更新并运行主应用程序的最小引导应用程序;
  2. 主要应用程序。

用户总是启动引导应用程序,而不是主应用程序(实际上用户并不知道引导应用程序)。这是迄今为止我见过的最常见的模式。

如果你想在运行时进行自动更新,你需要使用 OSGI,就像 javabeats 提到的那样。但只有在您真的需要时才选择这条路。我从未使用过 OSGI,但我可以想象它的重要性。

编辑

我没有具体的例子,但我可以想象

  1. 引导程序会下载一些 jar 和配置文件
  2. 其中一个配置文件包含类路径中所需的文件(这可以由您的应用自动完成,如果它选择给定文件夹内的所有 jar 文件)。
  3. 使用之前的列表,创建一个新的类加载器(参见示例here)以将 jar 文件添加到类路径中。
  4. 在新的类加载器中运行应用程序的主类。

对不起,如果不自己编写代码,我无法给你更详细的答案,但我会为此收费:)。

【讨论】:

  • 在运行时自动更新对于任何重要的应用程序来说几乎都不是一个好主意。进入坏状态的方法太多。重新启动主应用程序总是更好。
  • 我绝对同意你的看法。我认为在基于插件/微内核的应用程序中更容易(我以 Jenkins 为例)。更复杂的事情需要重新启动。
  • 您能举一个例子说明如何使这项工作发挥作用吗?我正在考虑运行命令行 arg 以从引导程序执行 java -jar myJar.jar,但必须有更雄辩的方式,不是吗?
  • 您也可以使用 ProcessBuilder 启动一个新的操作系统进程,然后让引导应用程序正常退出。 docs.oracle.com/javase/1.5.0/docs/api/java/lang/…
【解决方案2】:

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

【讨论】:

  • 你不需要 OSGI,只需要 2 个程序。
  • 也是我的选择,但我坚持问题要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2010-12-12
  • 2012-06-30
  • 2014-07-28
  • 2015-02-11
  • 1970-01-01
相关资源
最近更新 更多