问题:我有一个独立的Java应用程序(以下称为“代理”),它作为内部公司服务器上的服务运行。它充当某些中央服务器的远程代理。随着代理部署在更多地方,管理它们变得越来越复杂。具体来说:推送更新很痛苦,因为它是一个相当手动的过程,并且访问日志和有关运行代理的环境的其他信息是有问题的,这使得调试变得困难。正在讨论的服务器无头且无人值守,这意味着这必须是一个完全自动化的过程,无需人工干预,因此 Java Web Start不是一个可行的解决方案。
建议的解决方案:定期将座席电话置于家中(到中央服务器)以提供座席状态并检查更新。
我对这个问题的其他建议解决方案持开放态度,但我已经有了一个关于“状态和自我更新”想法的工作原型,这就是这个问题的重点。
我想出的实际上是一个单独的项目,充当代理的包装器。包装器通过HTTP定期调用中央服务器以检查代理的更新版本。找到更新后,它会下载新版本,关闭正在运行的代理,然后启动新版本。如果这似乎是一个奇怪的或迂回的解决方案,这里有一些值得注意的其他考虑/约束:
问题:如上所述,我想知道如何制作自我更新的Java应用程序。更具体地说,是否有任何框架/库可以帮助我解决这个问题?有这方面经验的人能给我一些指示吗?
答案 0 :(得分:4)
如果您的应用程序是基于OSGi的,您可以让OSGi为您处理捆绑包更新。它类似于您建议的包装器方法,因为OSGi容器本身是“包装器”,其中一些不会更新。以下是对this
的讨论答案 1 :(得分:4)
不同的解决方案:使用(并付费)install4j。查看自动更新功能here
答案 2 :(得分:3)
不需要包装器(保存内存)或java web start(对应用程序添加更多限制),只需让应用程序中的某个线程定期检查更新(例如从云端)并下载更新(如果可用),然后对这两个进行编码在你的申请中打电话:
.sh
或.cmd
)以更新您的工件并在脚本暂停几秒后启动您的应用程序(以避免同时存在两个应用程序实例)。 该脚本可以覆盖所需的工件并重新启动您的应用程序。
享受!
答案 3 :(得分:2)
查看Java Web Start。
从1.5开始,这是Java的一部分技术?也许1.4?并允许通过Web浏览器部署和安装独立的基于Java的应用程序。它还使您能够始终运行最新的应用程序。
http://www.oracle.com/technetwork/java/javase/overview-137531.html
http://en.wikipedia.org/wiki/JNLP#Java_Network_Launching_Protocol_.28JNLP.29
也会看到这个问题:What's the best way to add a self-update feature to a Java Swing application?
答案 4 :(得分:0)
似乎Webstart是目前唯一的内置方式。