热部署内部是如何工作的?

13

我正在使用Eclipse服务器功能进行热代码部署,使用Tomcat作为Web服务器。但我不确定它是如何工作的。我自己理解它必须在内部如何工作。

我的理解:当开发人员更改代码时(例如类Employee),Eclipse将在Web服务器下的特定位置(必须是特定的Web /应用服务器)放置/发布修改后的编译类。现在,特定于Web服务器的类加载器将出现在画面上。它找到HDD下的新条目。现在,它查找类是否已经被Perm Gen空间中的类加载器加载,如果已经加载,则Web服务器将从Perm Gen空间中卸载它,并在服务器无需重新启动的情况下内部加载新的条目以反映新变化(字节码)。作为重载的一部分,Web服务器还将链接现有的Employee对象与Perm Gen空间中的新类定义,以反映新的更改。

我的理解正确吗?

一些链接,例如此链接说Eclipse热部署只是重新部署的自动化。我认为这意味着Eclipse会自动停止服务器,重新发布并重启而无需开发人员干预。但我认为这是不正确的,因为这个过程比启动/发布/重启要快得多。 而且如果这是真的,会话和其他活动对象如何在重新启动后保持活动状态?也许这个链接过去是正确的,但现在我发现热部署也适用于jar中的类。


2
可能是什么使热部署成为“难题”?的重复问题。 - ivan_pozdeev
@ivan 这不是重复的。你提到的链接并不是关于热部署内部的,而是关于挑战。 - emilly
它的被接受的答案确实解释了内部发生的情况。也许您需要更多细节,但那是另一回事。 - ivan_pozdeev
FYI,在Java 8中不存在PermGen。 - kritzikratzi
1个回答

10

热部署取决于运行时能力。您链接的答案并不意味着自动化停止服务器部署新代码并重新启动服务器。这将是浪费的。

相反,大多数Java应用服务器能够重新部署应用程序。这意味着服务器将创建一个新的Web应用程序类加载器,通过此新类加载器加载应用程序的新版本,在某些情况下,它将迁移状态(序列化/反序列化HTTP会话),并丢弃旧版本的应用程序。

现在重新部署速度非常依赖于应用程序本身--如何初始化应用程序。它是否必须预热缓存?它是否必须满足依赖项(比如Spring、CDI)?它是否必须初始化Hibernate SessionFactory?涉及许多因素。

Eclipse WTP自然所做的就是可以触发应用程序容器的重新部署过程-仅此而已。当然,一个小应用程序不需要很长时间才能重新部署。

除非有特殊的运行时技术/容器/框架,并且为Eclipse开发了特殊的连接器来利用触发特定技术的热代码更新的钩子。一个很好的例子是针对OSGi运行时的bndtools

仅为消除一些困惑:

人们经常混淆HotSwap热部署。第一个HotSwap是JVM在运行时更新类定义的能力。后者热部署则是应用服务器自动部署应用程序的能力,可以增量或不增量地进行,而无需重新启动JVM进程。

因此我的答案是关于热部署,而不是关于HotSwap。因此我将热部署称为“自动化”,而不是平台的基本机制。


谢谢 Antan。正如你所说的,“相反,大多数Java应用程序服务器都能够重新部署应用程序”,但是Eclipse(ID)如何告诉服务器它需要重新部署应用程序呢?它会将新的类文件放置在特定位置,然后服务器只重新部署那些文件还是整个应用程序呢? - emilly
你所说的第二点是 在某些情况下,它将迁移状态(序列化/反序列化HTTP会话),我的问题是它是否会迁移除会话对象之外的其他对象(比如领域/服务对象)的状态? - emilly
@emily Eclipse触发完整应用程序重新部署。关于状态迁移-它必须是完全实现特定的。我没有看到除HTTP会话之外的任何其他状态被迁移。 - Anton Arhipov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接