当前位置: 首页 > 面试题库 >

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

昌栋
2023-03-14
问题内容

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

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

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


问题答案:

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

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

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

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

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

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

外部包装方法的优点是:

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

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

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

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

还应注意:

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

  • 向客户推送导致损坏客户的更新可能会带来法律风险,也可能会损害你的企业声誉。

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



 类似资料:
  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 2年前关闭。 改善这个问题 我如何制作可以自我更新的Java程序。我将此程序供小团队使用。我不需要任何高级功能。我只需要一个简单而最少的解决方案。 问题答案: Java Web Start 专门用于此目的。您提供了一个jnlp文件,而Java负责从服务器获

  • 问题内容: 我有一个页面,其中发生了许多耗时的功能。我想做的是在过程的每个步骤完成后,更新网页以使用户知道刚刚完成的步骤。本质上,用户提交查询,然后服务器查询数据库,处理数据,绘制图像并在页面上显示结果。我想让网页说出该功能执行的步骤。它会说“先查询”然后“正在处理” …等等。 伪: 我已经研究过使用Ajax来更新页面而不重新加载它,但是根据我的简单理解(对Ajax零经验),客户端将向服务器请求文

  • 不是一个真正重要的问题,但只是好奇。您可以在运行时更改应用程序图标吗?例如,有一个按钮,当您按下该按钮时,您会在flutter中获得不同的应用程序图标(假设应用程序图标已经“设置”)。Android和iOS。 非常感谢任何意见。谢谢

  • 我不熟悉JTable。 我想在button press事件中在运行时更新jtable数据。 这是我的密码。 但按下“更新”按钮后不会更新。 有人能解决我的问题吗? 提前谢谢。。

  • 问题内容: 我正在写一个Java库,实际上是一个Clojure库,但是对于这个问题,重要的是它在JVM上运行。该库需要执行一些JavaScript。我尝试过Nashorn,但遇到了一些局限性,可能难以克服。另外,我想尝试NodeJS。 我希望我的库是独立的,不依赖于独立运行NodeJS的系统,因此需要一种特殊的部署机制将Java和NodeJS工件放置在正确的位置,以便由两个不同的网络服务器接收。但

  • 问题内容: 这个问题与编程没有严格关系,但是对于程序员来说肯定是重要的。 我写了一个简单的smtp服务器,当我从控制台运行它时,一切都很好,只是它阻止了命令行。 我知道我可以通过运行它 或通过屏幕/ tmux等 但是问题是,我应该如何实现我的程序在后台运行,并且系统管理员可以很高兴地设置和管理该程序? 有些人比我有更多的经验,在golang- nuts上 写道,他们不使用fork等,而是使用mon