使用Tomcat插件实现WEB项目热部署

使用Tomcat插件实现WEB项目热部署

Tomcat热部署可以通过网页操作进行,也可以通过指定插件进行。本文介绍的是通过使用tomcat7-maven-plugin将WEB项目热部署到指定服务器的Tomcat中,并对期间遇到的问题进行分析和记录。

何为Tomcat热部署

把WEB部署到Tomcat下,一般是把war包放到Tomcat的webapp目录下,然后启动Tomcat,这样就完成了项目的部署。但这种方式属于冷部署,Tomcat需要关闭。当一个Tomcat下部署了多个项目时,如果有其他项目正在运行,显然不能通过冷部署的方式。

Tomcat热部署就是在Tomcat处于启动的状态下,Tomcat插件通过访问Tomcat-Manager提供的接口,把war通过网络传输的形式下载到webapp目录下并解压运行。其中Tomcat-Manager是Tomcat提供的一个热部署工具,在webapps/manager目录下。

配置tomcat-users.xml文件

在tomcat安装目录下找到tomcat-users.xml文件。该文件路径为

【tomcat安装根目录】/conf/。

修改文件内容,增加下列内容:

<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="admin" password="admin" roles="manager,manager-gui,manager-script"/>

这里配置了一个admin用户,拥有manager-gui manager-script权限。GUI权限是通过网页访问Tomcat-Manager页面的权限,script是通过接口访问Tomcat-Manager页面的权限。

权限配置完成后启动Tomcat,访问以下链接http://localhost/manager/html应该能看到此页面:在这里插入图片描述

配置项目pom文件

使用tomcat7-maven-plugin时,需要在项目的pom文件中引入插件配置:

<!-- tomcat7插件 -->
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>${tomcat.version}</version>
    <configuration>
        <port>${webserver.port}</port>
        <path>/${project.artifactId}</path>
        <uriEncoding>${project.build.sourceEncoding}</uriEncoding>
        <url>http://10.128.xxx.xxx:8080/manager/text</url>
        <username>admin</username>
        <password>admin</password>
    </configuration>
</plugin>

注意我这里的配置和网上大部分的配置都不大一样,因为我没配置<server></server>节点。实际上我认为,该节点的配置是失败的根源!

按网上说法,server节点指定了远程服务器上Maven配置项中的设置,用于获取访问tomcat的用户名和密码。

这种说法实际上是很奇怪的,为什么访问Tomcat的密码需要从Maven的配置文件中获取?万一远程主机没有配置Maven怎么办?想弄清楚这些问题还得从热部署的原理入手,不能迷迷糊糊地人云亦云。

Tomcat热部署原理剖析

前文已说,Tomcat-Manager是Tomcat提供的热部署工具。按以下路径打开web.xml文件:webapps\manager\WEB-INF\web.xml,可以看到如下的配置:

<!-- Define a Security Constraint on this Application -->
<!-- NOTE:  None of these roles are present in the default users file -->
<security-constraint>
<web-resource-collection>
  <web-resource-name>HTML Manager interface (for humans)</web-resource-name>
  <url-pattern>/html/*</url-pattern>
</web-resource-collection>
<auth-constraint>
   <role-name>manager-gui</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
  <web-resource-name>Text Manager interface (for scripts)</web-resource-name>
  <url-pattern>/text/*</url-pattern>
</web-resource-collection>
<auth-constraint>
   <role-name>manager-script</role-name>
</auth-constraint>
</security-constraint>

Tomcat-Manager工具实际上就是一个WEB工程,对外暴露了Tomcat内部和部署相关方法的接口,而web.xml就是这个WEB工程的配置文件。在这里配置了拦截器、上传文件大小限制(默认war包最大50M)、响应请求的Servlet等。

tomcat7-maven-plugin知道远程主机地址的唯一方式是读取pom文件中的<url></url>标签,因为请求了/manager/text路径,因此请求会被拦截,并校验用户名和密码以及该用户的角色。

按照上节的配置直接在pom中指定用户名和密码的方式当然是没问题的,关键是<server>节点。经过上述分析,该节点应该是本地主机配置的节点,而不是在远程主机配置。插件读取本地配置后拿到用户名和密码,再用该用户名密码去访问远程主机的Tomcat服务!部分网文说不清楚这个问题的原因是没有在远程主机上部署Tomcat,不清楚区别!

用插件热部署取代CD

很多公司在进行代码管控时会要求CI/CD。正常情况下,CI结束后会生成一个war包,CD环节将该war包复制到测试环境,并利用脚本工具冷启动该war包。

这种方式当然没有问题,但现在了解了既然可以通过Tomcat插件实现热部署,为什么还需要CD呢?因为只需要在CI环节指定maven的操作为:tomcat7:redeploy。插件会自动帮我们把war包热部署到Tomcat服务器,并运行最新版的WEB工程。

总结

本文粗略地介绍了使用Tomcat插件热部署WEB工程的方式,并对主要踩坑点进行了剖析。希望本文能给希望进行热部署的朋友带来一点新的思考,避免被网上众多的错误文章误导!

需要注意的是,本文所描述的热部署方式主要针对非SpringBoot工程,因为对于SpringBoot工程来说,项目编译完成后就是一个jar包,直接命令行启动就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值