热部署内部如何工作?

时间:2016-02-07 03:08:41

标签: java debugging hotdeploy

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

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

我的理解是否正确?

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

1 个答案:

答案 0 :(得分:3)

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

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

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

Eclipse WTP自然会做的是它可以触发应用程序容器的重新部署过程 - 就是这样。当然,小型应用程序不需要很长时间才能重新部署。

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

只是为了消除一些困惑:

通常,人们会混淆 HotSwap 热部署。第一个是HotSwap,它是JVM在运行时更新类定义的能力。后一种热部署是应用服务器自动部署应用程序的能力,无论是否递增,都不需要重新启动JVM进程。

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