Maven+Tomcat实现热部署

13 篇文章 0 订阅
8 篇文章 0 订阅

热部署:所谓热部署,就是在系统正在运行的时候升级软件,却不需要重新启动应用。

Tomcat热部署方式一:

直接将一个web项目打成一个war包,并将war包放入tomcat的webapps目录下,此时tomcat服务器会自动将次war包解压并在服务器上进行部署发布。

Tomcat热部署方式二:

使用Tomcat自带的Tomcat Manager来对tomcat上的web项目进行管理。
找到tomcat-users.xml这个配置文件,在这个配置文件的最下方,有如下这么几行标签:

<tomcat-users>
<!--
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
  <user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
  <user username="role1" password="<must-be-changed>" roles="role1"/>
-->
</tomcat-users
  • manager-gui:允许访问html接口(即URL路径为/manager/html/*)
  • manager-script:允许访问纯文本接口(即URL路径为/manager/text/*)
  • manager-jmx:允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)
  • manager-status:允许访问Tomcat只读状态页面(即URL路径为/manager/status/*)

以一个具体的配置为例:

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

最后,启动Tomcat服务器,访问http://localhost:8080/manager,然后输入用户名密码,此时用户名和密码都是:tomcat

登入成功能够以客户端的形式来进行tomcat上web项目,找到如下所示这一栏:

这里写图片描述

此处可以将一个war包上传到服务器中,上传成功后便会自动部署并发布(ps:有关Tomcat Manager的更多用处,有兴趣的朋友可以自己再去了解一下,此处主要说明tomcat的热部署)。


Maven项目下进行Tomcat热部署:

1、在pom文件中配置如下插件即可:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <configuration>
                <!-- 端口号,可自定义 -->
                <port>8080</port>
                <!-- 项目访问路径 -->
                <path>/qing</path>
                <!-- Tomcat Manager的url访问路径,固定写法 -->
                <url>http://localhost:8080/manager/text</url>
                <!-- Tomcat Manager的用户名和密码 -->
                <username>tomcat</username>
                <password>tomcat</password>
            </configuration>
        </plugin>
    </plugins>
</build>

2、进入Tomcat的bin目录启动tomcat服务器,或者在myeclipse、eclipse中启动tomcat服务器

3、在eclipse或者myeclipse中右键点击需要热部署的web项目,选择:Run As–>Maven build..,输入:
这里写图片描述

3.最后点击Run,然后访问:http://localhost:8080/qing/index.html,能够成功访问项目说明项目部署成功。

注:
1、想要在maven项目中进行tomcat的热部署,必须要开启Tomcat Manager
2、部署到远程服务器也是相同的道理,只需要将localhost改为tomcat所在的服务器IP即可


问题:

问题1:

在部署到远程服务器时,出现以下问题:

[INFO] I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error
[INFO] Retrying request
Uploading: http://******/manager/text/deploy?path=%2F
4098/35084 KB   
[INFO] I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error
[INFO] Retrying request
Uploading: http://******/manager/text/deploy?path=%2F
4096/35084 KB   

经过查询资料后发现,这是由于Tomcat的远程地址拦截器造成的结果,默认情况下,Tomcat的Manager和Host-Manager只接受本机的请求,要让它接受远程的请求,需要添加manager.xml的配置。

在tomcat服务器的conf/Catalina/localhost/目录下创建一个manager.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<Context privileged="true" antiResourceLocking="false"
         docBase="${catalina.home}/webapps/manager">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>

如果需要实现允许特定的IP地址访问Manager的需求,可在上面的allow属性中设置规则。具体规则设置见下面的链接:
详情链接

问题2:

同时在解决问题的过程中也考虑到多次重复部署带来的问题,也就是tomcat内存泄漏,Tomcat会为项目新建一个类加载器,而旧的类加载器没有被GC回收。

classloader-leak-prevention-servlet用来解决maven部署内存泄漏的问题,添加依赖到项目:

<!-- TODO 解决maven远程部署内存泄漏的问题-->
<dependency>
    <groupId>se.jiderhamn.classloader-leak-prevention</groupId>
    <artifactId>classloader-leak-prevention-servlet</artifactId>
    <version>2.1.0</version>
</dependency>

并在项目的web.xml 中添加监听器 (该listener 必须为项目的第一个监听器,否则不起作用)

<listener>
    <listener-class>se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventorListener</listener-class>
</listener>

附上:在pom.xml文件中,在plugins节点下添加如下plugin节点:

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <!-- server、username、password对应maven的setting下的配置 -->
        <url>你的tomcatd的IP:端口号/manager/text</url>
        <server>tomcat</server>
        <username>admin</username>
        <password>admin</password>
        <!-- 重新部署时更新-->
        <update>true</update>
        <path>/${project.build.finalName}</path>
        <!-- war文件路径缺省情况下指向target -->
        <!--<warFile>${basedir}/target/${project.build.finalName}.war</warFile>-->
    </configuration>
</plugin>

mvn tomcat7:redeploy取代 undeploydeploy来重新部署

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值