热部署内部如何工作?

emi*_*lly 8 java debugging hotdeploy

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

我的理解: -当开发人员在代码中进行更改(比如类Employee)时,Eclipse会将修改后的编译类放置/发布到正确的位置(必须是特定的Web/app服务器.让我们称之为热部署目录(HDD))在webserver下.现在,Web服务器特定的类加载器将进入图片.它在HDD下找到新条目.现在,它发现类是否已经由perm gen空间中的类加载器加载,webserver将从permgen空间卸载它并在内部加载新的,而不重新启动服务器,以便反映新的更改(字节代码).作为重新加载的一部分,webserver还将现有的Epmloyee对象与perm gen空间中的新类定义链接起来,以便反映新的更改.

我的理解是否正确?

这样的一些链接说Eclipse热部署只是重新部署的自动化.我认为这意味着eclipse会自动停止服务器,重新发布并重新启动它,而无需开发人员干预.Buti我认为这不正确,因为与start/publish/restart相比,这个过程非常快.此外,如果它是真的,重启后会话和其他活动对象将如何保持活动状态?可能这个链接在过去是真实的但现在不是因为我发现热部署也适用于jar中的类

Ant*_*pov 5

热代码部署取决于运行时功能。您链接到的答案并不意味着自动停止服务器部署新代码并再次启动服务器。这本来是浪费的。

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

现在,重新部署的速度在很大程度上取决于应用程序本身-应用程序的初始化方式。是否需要预热缓存?是否必须满足依赖关系(a-las Spring,CDI)?是否必须初始化Hibernate SessionFactory?涉及许多因素。

Eclipse WTP自然要做的就是它可以触发应用程序容器的重新部署过程,仅此而已。当然,小型应用程序不会花很长时间重新部署。

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

只是为了消除一些混乱:

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

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