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