記一次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`來重新部署

`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章