使用Tomcat重新加载功能加快开发速度

遵循Java Servlet 规范第4节中的建议 ,Apache Tomcat实现了系统地重新加载Java类的方法,以允许在不重新启动整个服务器的情况下更新应用程序的组件。  
此功能对于开发非常重要,因为事实证明,随着服务器启动和重启时间的延长,这会严重浪费开发人员的时间。实际上,Java EE堆栈应用服务器的服务器重新启动时间很慢,这是Tomcat广泛用于个人和企业级项目的推动力之一。
但是,即使Tomcat也无法  像运行时重新加载应用程序一样快地启动。通过仅重新加载隔离的应用程序的更改的类,开发人员可以在几秒钟而不是几分钟内启动并运行新功能。
在本文中,我们将介绍适当的 配置 并为Tomcat提供的所有不同机制示例使用Tomcat,以重新加载应用程序和Java类,包括: 
•    通过服务器重启重新加载
•    手动重新加载Tomcat Manager
•    通过上下文设置进行热加载
•    使用WatchedResources热装
•    使用诸如Eclipse之类的IDE进行热重载
我们还将介绍一些您不应该在生产环境中使用自动重装的原因 ,以及一些替代解决方案。
重新加载的工作方式
在开始之前,让我们快速定义本文中使用的一些术语,以避免造成混淆。  
在本文中,您将看到对“重新加载”和“重新部署” Web应用程序的引用。尽管两者都与将对应用程序的更改传播到服务器以供使用有关,但这些术语并不是完全可以互换的。
在Apache Tomcat服务器上,“重新加载”应用程序意味着在给定Context上调用StandardContext类的方法,该方法称为StandardContext.reload()  。此方法创建一个新的类加载器和新的Servlet,删除对旧Servlet的所有引用,然后在Servlet上调用Servlet.init()方法,从而使Servlet进入初始化状态,并触发所有类和库的重新加载。新的类加载器。  
相比之下,“重新部署”是指首先将应用程序从其部署目录中完全删除,然后再从appBase目录中将其重新部署到服务器上。  
关于服务器重启的一句话
重新加载Web应用程序的最基本,没有错误的方法是重新启动Tomcat服务器。尽管此方法很慢,并且在服务器上运行多个应用程序时确实很麻烦,但是在许多情况下,完全重新启动服务器是重新加载应用程序的最合适方法。  
这些特殊情况包括您的应用程序具有必须在Catalina的server.xml文件中配置的组件 (例如GlobalNamingResources)的情况,或者您已经使用docBase的符号链接来配置应用程序设置的情况。 
重新启动Tomcat服务器也是一种停止和重新启动应用程序的方法,它允许重新加载诸如web.xml文件之类的元素(尽管有一些方法可以在不停止服务器的情况下重新加载这些文件)。
通过Tomcat管理器重新加载
Tomcat Manager是Tomcat的所有标准发行版附带的Web应用程序,即使应用程序上下文未配置为“可重载” ,它也具有重新加载Web应用程序(以及启动,停止, 部署和取消部署它们)的能力。这对于在生产环境中重新加载应用程序特别有用,在生产环境中应禁用Tomcat的自动重新加载功能,或者在性能较低的环境中自动重新加载可能导致 内存 问题。  
一旦正确配置了Tomcat Manager,就可以通过位于http:/ {host}:{port} / manager / html的Web控制台或通过各种旨在显示其脚本功能的基于URI的命令来访问它。  
要从Web控制台重新加载应用程序,请导航至“列出应用程序”选项卡。在此页面上,可以从服务器上部署的所有要重新加载的应用程序的列表中选择一个应用程序。要通过URI命令重新加载应用程序,请使用以下格式:
http:/ [主机名]:[端口] / manager / reload?path = [/ path / to / your / webapp ]
即使您尚未将应用程序上下文声明为“可重载”,这些命令也可以使用。请注意,迄今为止(Tomcat 6 .0.26),Manager应用程序无法重新加载作为WAR文件部署的应用程序,只能重新加载作为爆炸目录部署的应用程序。  
要使用Manager重新加载WAR部署的应用程序以反映更改,您可以取消部署该应用程序,然后重新部署它。Tomcat管理器也不能用于将更改重新加载到web.xml文件。要传播这些更改而无需使用Manager重新启动整个服务器,只需停止然后再启动该应用程序即可。或者,您可以将这些文件配置为WatchedResources, 如下所示。
出于明显的 安全 原因,默认情况下禁用Tomcat管理器。启用它不需要对Tomcat的配置进行一项或多项更改。  
有关配置和使用Tomcat Manager的重载功能及其所有其他功能的完整指南,请访问我们的“充分利用 Tomcat Manager”一 文。
通过上下文设置热加载
在面向细节的开发阶段(例如优化),通常需要进行许多小的更改,其中一些仅仅是对可以编码单个功能部件的各种方法的测试。在这种环境中,通过Manager应用程序手动触发每个重新加载是不可行或不够高效的。  
为了解决此问题,Tomcat在Catalina组件中包含了一种称为“ backgroundProcess”的方法。通常,此过程提供会话期满,但是如果配置正确,它也可以监视应用程序的所有类的更改,并在它们中的任何一个更改时要求重新加载。
要配置重新加载,请将“ reloadable”属性添加到应用程序的Context元素中,可以在其Context片段中或在Server.xml中:
<Context ... reloadable =“ true”>
您还可以通过backgroundProcessorDelay属性在context元素中的容器上运行backgroundProcess之前,以秒为单位配置延迟,尽管该值也可以从Host或Engine继承。
使用WatchedResource热装
当您将上下文定义为“可重载”时,Catalina的默认行为是监视其类,库和web.xml配置文件中的更改以触发重载。有时您会想要将其他文件添加到此列表,例如记录器配置文件。在这些情况下,可以使用Context中嵌套的WatchedResource元素来指定Tomcat应该监视的其他文件。使用以下语法:
    
<Host> 


<Context ... reloadable="true">

 <WatchedResource>path/to/watched/resource</WatchedResource>


 <WatchedResource>another/path/to/another/resource</WatchedResource>


</Context>

</Host>


    
请注意,每对WatchedResource标签中只能包含一个文件。如果要为所有上下文创建全局设置,则可以在应用程序的context.xml片段,server.xml文件或Catalina的conf / context.xml文件中配置这些设置。
使用Eclipse IDE热装
通过将您的上下文配置为在更改类时自动重新加载,并使用Web工具平台集成Tomcat和Eclipse(或任何其他Java IDE),可以为开发环境添加热重新加载功能。
请遵循以下简单配置步骤:
•    如果您尚未将Tomcat与Eclipse集成,请访问我们的Tomcat Eclipse 集成分步指南,它将逐步引导 您。
•    请按照上一部分中提供的配置步骤在Tomcat服务器上启用热重载。
•    配置Eclipse工作区,使其直接指向正在运行的Tomcat服务器的文件夹结构。这可能需要一些权限配置。
•    在服务器运行时直接编辑类,并观察Tomcat在保存它们时自动重新加载您的应用程序。
转向生产
热重装对于开发非常有用,但是在将应用程序移至生产环境之前,应确保禁用所有自动重装配置。以下是一些为何如此重要的见解。
重载类很复杂。如果在创建新类时仅保留对旧类的引用,则旧类将无法正确处理,这被称为Classloader泄漏。这是任何Java平台上最常报告的问题之一。
除了这一考虑之外,Tomcat用于重新加载应用程序的Servlet.init()方法还要求重新初始化整个应用程序,这是一个多步骤的过程,随着应用程序复杂性的增加,其开销也随之增加。
 
最后,自动重装失败会导致状态数据丢失,这在生产环境中是不可接受的。
出于这些原因,最好在移至生产环境时禁用所有自动重新加载,并依靠Tomcat Manager或其他管理工具 来管理应用程序。

相关文章

遵循Java Servlet 规范第4节中的建议 ,Apache Tomcat实现了...
JMX(Java管理扩展)是一项非常强大的技术,可让您管理,监视...
总览介绍 建立 取得Java 获取TomCat 将TomCat安装为Window...
PSI Probe是Lambda Probe的社区驱动分支,使用相同的开源许可...