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