记一次Maven远程部署到tomcat所遇到的Bug:java.net.SocketException: Connection reset by peer: socket write error

使用 tomcat7-maven-plugin 插件远程部署项目到tomcat中时遇到错误,刚开始一两周没有问题,后来由于新发布版本,重新部署,使用maven命令:

mvn clean
mvn tomcat7:undeploy
mvn tomcat7:deploy

出现项目部署不上报错的问题,
java.net.SocketException: Connection reset by peer: socket write error
并出现报错类似下图:
这里写图片描述

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

=> 参考一位博客园博主的文章:
https://www.cnblogs.com/xyb930826/p/5725340.html

在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属性中设置规则。具体规则设置见下面的链接:

http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Remote_Address_Filter

=> 同时在解决问题的过程中也考虑到多次重复部署带来的问题,也就是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:8080/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`取代  `undeploy`和`deploy`来重新部署

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带着天使反上帝 - Kaybee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值