我运行一个大多数时间都很忙的java应用程序。 当我需要升级它时,我会发送一条消息,在下一个可用的机会干净地退出,然后升级类文件,然后重新启动它。 我真的希望能够做的是升级类文件,然后让程序在下一个好机会踢自己,但是我发现(这是solaris)是,如果你修改磁盘上的文件当一个程序正在运行,有时会发生不好的事情。 我认为,因为并不是所有的类文件都在jvm中,所以有时需要从磁盘重新加载,或者solaris正在从磁盘加载不匹配旧的二进制文件的部分文件。 我已经看到它与C二进制文件也是如此。 有什么build议么? 做一个移动和复制是否更安全,所以相同的磁盘信息不会被写入,但是新的文件是由一个新的inode创build的?
还可以使用webstart(具有其他限制)自动化升级,或者将更新集成到启动脚本中,例如:1.检查新文件中是否有文件,将它们复制到生产环境中2.启动应用程序
这样你所需要的就是重启。 你可以复制,rsync,ftp,…
覆盖jar/类不起作用。 原因很简单:您可以在内存中加载一个类,然后由于内存压力卸载,然后重新加载。 如果你改变底层的类文件,你会得到一个老系统的新类,这会造成麻烦。
您最好的select是在应用程序中构build热部署(或者让开发人员使用以下解决scheme构build它们):
或任何适合你最好的。