如何实现类Tomcat的jar自动部署适配Jasper server-pro
Tomcat无重启自动部署代码变更的实现原理
- 核心逻辑靠两套机制配合完成:一是Tomcat的分层隔离类加载器架构,二是容器后台常驻的轮询检测线程
- Tomcat会给每一个部署在其上的Web应用分配独立的
WebappClassLoader实例,和Tomcat核心容器的类加载器完全隔离。当检测到应用代码变更时,容器会直接销毁旧的应用类加载器,创建新的类加载器实例加载更新后的代码,整个过程不需要重启JVM进程,Tomcat本身的服务不会中断 - 容器启动后会跑一个后台任务,轮询间隔由
backgroundProcessorDelay参数控制(单位为秒),定期扫描应用目录下的监控目标文件:包括WEB-INF/classes下的class文件、WEB-INF/lib下的jar包、WEB-INF/web.xml等核心配置 - 一旦检测到文件的修改时间、大小发生变化,就会触发应用上下文的重载流程:先销毁当前应用注册的所有Servlet、Filter、监听器,清空旧类加载器的内存引用,再用新的类加载器重新初始化整个应用上下文,完成代码更新的加载
Jasper Server-Pro 启用Jar包自动部署的配置要求
- 版本适配:Jasper Server-Pro 7.2及以上版本,低版本内置的Tomcat移除了自动部署的相关逻辑,修改配置也无法生效
- 权限要求:启动Jasper服务的系统账号,必须对部署目录下的
WEB-INF/lib、WEB-INF/classes、conf/Catalina/localhost路径拥有完整读写权限,否则检测到变更也无法完成重载流程 - 场景适配:热重载过程中对应应用的请求会出现短暂中断,不建议核心生产环境长期开启,更适合测试、UAT等需要频繁迭代代码的环境使用
具体操作步骤
- 先停掉正在运行的Jasper Server-Pro服务,避免修改配置时出现文件锁冲突、配置写入失败的问题
- 打开内置Tomcat的主配置文件,默认路径为
apache-tomcat/conf/server.xml,找到对应的Host配置节点,默认配置如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false">
将节点的autoDeploy属性改为true,新增reloadable="true"属性,同时根据需要调整轮询检测间隔(比如设置为5秒扫描一次),修改后配置如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" reloadable="true" backgroundProcessorDelay="5">
- 打开Jasper应用的上下文配置文件,默认路径为
apache-tomcat/conf/Catalina/localhost/jasperserver-pro.xml,在Context节点下添加监控资源规则,必须手动将WEB-INF/lib加入监控列表——默认配置只会监控classes目录和web.xml,不会检测jar包变动,配置参考如下:
<Context reloadable="true" > <WatchedResource>WEB-INF/web.xml</WatchedResource> <WatchedResource>WEB-INF/lib</WatchedResource> <WatchedResource>WEB-INF/classes</WatchedResource> </Context>
- (可选配置,减少内存泄漏概率)打开
apache-tomcat/conf/context.xml全局配置,在Context节点添加线程回收相关参数,避免重载后旧线程残留导致内存溢出:
<Context reloadable="true" clearReferencesStopThreads="true" clearReferencesStopTimerThreads="true">
- 保存所有修改后的配置文件,重新启动Jasper Server-Pro服务
- 有效性验证:替换
webapps/jasperserver-pro/WEB-INF/lib路径下的自定义jar包,等待对应轮询间隔后查看服务日志,如果出现Reloading Context with name [/jasperserver-pro] has started和Reloading Context with name [/jasperserver-pro] is completed的日志记录,就代表自动部署配置生效,全程不需要手动重启服务
注意:该热部署能力仅对应用自身目录下的jar包、class文件、web配置生效。如果修改了Tomcat公共lib目录下的依赖、JVM启动参数、server.xml中的容器级配置,还是需要重启整个服务才能生效。
内容的提问来源于stack exchange,提问作者Sagar Krishna
相关产品推荐
相关产品推荐

