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

使用 tomcat7-maven-plugin 插件远程部署项目到tomcat中时遇到错误,

开始时

1.安装tomcat

准备tomcat,端口为默认8080,所在服务器IP为xxx.xx.xxx.xxx. 首先去配置tomcat的conf目录下的tomcat-user.xml,连接服务器之后进入到conf目录下,然后输入:vi tomcat-user.xml,然后在指定的内容里输入(千万不要输入注释里面,不然没有效果):

  1. <role rolename="manager-gui"/>

  2. <role rolename="manager-script"/>

  3. <user username="tomcat" password="tomcat" roles="manager-gui,manager-script" />

注:"manager-gui"与"manager-script"必须填写。

然后是maven 的setting,xml 配置

 
  1. <server>

  2. <id>tomcat7</id>

  3. <username>tomcat</username> <!-- tomcat-user.xml 中的username-->

  4. <password>tomcat</password> <!-- tomcat-user.xml 中的password-->

  5. </server>

2.项目pom.xml配置

pom文件中加入如下插件配置:

 
  1. <!-- Tomcat 自动部署 plugin -->

  2. <plugin>

  3. <groupId>org.apache.tomcat.maven</groupId>

  4. <artifactId>tomcat7-maven-plugin</artifactId>

  5. <version>2.2</version>

  6. <configuration>

  7. <port>8080</port> <!-- 项目的端口-->

  8. <path>/OvertimeReport</path> <!-- web项目的项目名称-->

  9. <uriEncoding>UTF-8</uriEncoding>

  10. <url>http://localhost:8080/manager/text</url> <!-- 对应的 tomcat manager的接口-->

  11. <server>tomcat7</server> <!-- setting.xml 的server id-->

  12. <username>admin</username> <!-- tomcat-user.xml 的 username -->

  13. <password>123456</password> <!-- tomcat-user,xml 的 password -->

  14. </configuration>

  15. </plugin>

执行命令: mvn tomcat7:redeploy 

重新部署,使用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`来重新部署

猜你喜欢

转载自blog.csdn.net/qq_37706228/article/details/82691998