Maven热部署项目到Tomcat
使用maven插件的热部署功能可以很方便的将maven项目部署到远程tomcat服务器,由于tomcat接受推送部署的接口较为稳定,因此在tomcat的7.x、8.x、9.x均适用。
1,开启tomcat推送热部署功能
编辑tomcat服务器下的conf/tomcat-users.xml,在末尾增加
1 <role rolename="manager-gui"/>
2 <role rolename="manager-script"/>
3 <user username="tomcat" password="tomcat" roles="manager-gui"/>
4 <user username="root" password="root" roles="manager-script"/>
其中gui角色用于web页面推送部署,script角色用于maven插件推送部署,因为对于tomcat9来说,不能同时赋予用户manager-script和manager-gui角色,因此建立两个用户。
开启发起远程部署ip限制,在tomcat服务器的conf/Catalina/localhost/目录下创建一个manager.xml文件,内容为
1 <?xml version="1.0" encoding="UTF-8"?>
2 <Context privileged="true" antiResourceLocking="false" docBase="${catalina.home}/webapps/manager">
3 <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
4 </Context>
然后在浏览器中输入http://serverip:port/manager/html,此时会弹出要求输入用户名和密码对话框,输入manager-gui对应的用户和密码登录管理控制台(其中serverip为服务器ip,如果服务器在本地就是localhost或者127.0.0.1,端口为tomcat端口,默认8080)。以此确认manager是否配置正确。正确结果示例如下:
2,添加maven对应tomcat推送热部署插件
在pom.xml文件中,在plugins节点下添加如下plugin节点
1 <plugin>
2 <groupId>org.apache.tomcat.maven</groupId>
3 <artifactId>tomcat7-maven-plugin</artifactId>
4 <version>2.2</version>
5 <configuration>
6 <url>http://127.0.0.1:8080/manager/text</url>
7 <username>root</username>
8 <password>root</password>
9 <update>true</update>
10 <path>/centerbusiness</path>
11 </configuration>
12 </plugin>
将上面的serverip和port换成自己tomcat服务器的ip和端口。密码换成上面配置的manager-script角色的密码。path改为项目在tomcat服务器中的部署路径。
然后进行部署,如果是第一次部署,运行mvn tomcat7:deploy进行自动部署(对于tomcat8,9,也是使用tomcat7命令),如果是更新了代码后重新部署更新,运行mvn tomcat7:redeploy。
如果第一次部署使用mvn tomcat7:redeploy,则只会执行上传war文件,服务器不会自动解压部署。
如果路径在tomcat服务器中已存在并且使用mvn tomcat7:deploy命令的话,上面的配置中一定要配置<update>true</update>,不然会报错。
3,tomcat热部署内存泄漏
使用上面的方法进行部署后会出现严重的内存泄漏现象。tomcat的manager提供了诊断在部署时是否产生内存泄漏的功能,在上面提到的http://serverip:port/manager/html这个页面底部有一个“Find leaks/发现泄露”的按钮,如下:
点击按钮,网页头部出现如下信息说明在部署的时候有内存泄漏:
上面的消息显示部署的test项目存在内存泄漏,如果同一项目多次重新部署,则一个项目名可能会出现多次。
部署时产生内存泄漏的原因是每次(重新)部署时,Tomcat会为项目新建一个类加载器,而旧的类加载器没有被GC回收。
4,传统web项目热部署内存泄漏解决办法
针对传统带有web.xml的项目,maven的库classloader-leak-prevention-servlet可以用来解决这个问题。具体方案为:
(1)添加maven依赖:
1 <dependency>
2 <groupId>se.jiderhamn.classloader-leak-prevention</groupId>
3 <artifactId>classloader-leak-prevention-servlet</artifactId>
4 <version>2.1.0</version>
5 </dependency>
(2)在项目的web.xml中添加一个Listener(必须让此Listener成为web.xml中的第一个Listener,否则不起作用)
1 <listener>
2 <listener-class>se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventorListener</listener-class>
3 </listener>
这样部署时的内存泄漏就解决了。
注意:
1) 添加这个Listener后,默认在tomcat关闭5s后jvm会进行内存回收的操作,具体时间设置可在下面的第三个参考链接中找到,所以,在关闭后的5s内,再次启动tomcat,可能会存在问题,导致启动无效(如果出现tomcat重启后日志显示正常但是服务器不工作的话考虑一下是不是这个问题)。
2)这个Listener只解决部署的内存泄漏,其他问题(如jdbc等)产生的内存泄漏还需要自己解决。
5,SpringBoot项目热部署内存泄露解决办法
目前SpringBoot热部署内存泄漏无解!只能热部署到方法区内存溢出后重启tomcat。