如何编写可以在运行时进行自我更新的Java应用程序?

乔纳斯:

我想实现一个Java应用程序(服务器应用程序),该应用程序可以从给定的URL下载新版本(.jar文件),然后在运行时进行自身更新。

最好的方法是什么,有可能吗?

我猜该应用程序可以下载一个新的.jar文件并启动它。但是我应该如何进行切换,例如知道何时启动新应用程序然后退出。还是有更好的方法来做到这一点?

斯蒂芬·C:

解决方案的基本结构如下:

  • 有一个主循环负责重复加载应用程序的最新版本(如果需要)并启动它。

  • 该应用程序会执行其操作,但会定期检查下载URL。如果检测到新版本,它将返回启动器。

您可以通过多种方法来实现此目的。例如:

  • 启动器可以是包装脚本或二进制应用程序,它可以启动新的JVM,以从被替换的JAR文件中运行该应用程序。

  • 启动器可以是Java应用程序,它为新的JAR创建类加载器,加载入口点类并在其上调用一些方法。如果以这种方式执行此操作,则必须注意类加载器存储泄漏,但这并不困难。(您只需要确保重新启动后无法访问从JAR加载的类的对象即可。)

外部包装方法的优点是:

  • 您只需要一个JAR,
  • 您可以替换整个Java应用程序,
  • 应用程序等创建的所有辅助线程将消失,而无需特殊的关闭逻辑,并且
  • 您还可以处理从应用程序崩溃等中恢复。

第二种方法需要两个JAR,但具有以下优点:

  • 该解决方案是纯Java且可移植的,
  • 转换将更快,并且
  • 您可以在重新启动期间更轻松地保留状态(模泄漏问题)。

“最佳”方式取决于您的特定要求。

还应注意:

  • 自动更新存在安全风险。通常,如果提供更新的服务器受到损害,或者提供更新的机制容易受到攻击,则自动更新可能会导致客户端受到损害。

  • 向客户推送更新可能导致客户损失的更新可能具有法律风险,也可能威胁到您的企业声誉。


如果您能找到避免重新发明轮子的方法,那将是很好的。请参阅其他答案以获取建议。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

运行时如何自我更新应用程序

在iOS Swift中进行本地化。我如何在运行时更改应用程序语言

在运行时对Scala / Java应用程序进行远程探测

如何在运行时更新SpringBoot应用程序的配置而不重载整个ApplicationContext

如何在运行时获取Java应用程序的真实路径?

如何停止应用程序进行自我更新?

如何在运行时检查我的Rails应用程序是否在开发环境或生产环境中运行

当NetworkExtension运行时,如何让iOS / macOS更新我们的应用程序?

如何使用Swift在运行时使我的应用程序表现得就像我在更改Application is agent(UIElement)?

如何让 Java 程序在运行时生成另一个 Java 应用程序

如何在运行时更新数据存储在主应用程序类中的变量中的 kivy 标签颜色

可以在运行时更改argv(不能由应用程序本身更改)

更新到Android 3.6工作室后,在运行时应用程序崩溃

在运行时更新UWP应用程序的任务栏图标

在运行时检测 MSIX 打包的应用程序

在运行时更改Polymer应用程序的主题

在运行时更改应用程序主题

在运行时更改应用程序MainForm

在运行时更改应用程序语言

在运行时设计 Angular 应用程序的样式

Web应用程序:在运行时删除文件

在运行时在我的应用程序中添加数据源

当我尝试设置MapType时,MapFragment使应用程序在运行时崩溃

我可以在运行时更新 AMQP 设置吗?

在运行时,找到扩展基类的Java应用程序中的所有类

基于SAP Java Buildpack的cf应用程序在运行时更改日志级别

如何在应用程序仍在运行时刷新它(活动)?

应用程序如何在运行时解析为共享库的不同版本?

如何在运行时为独立应用程序提供可用的 jar?