使用 tomcat7-maven-plugin
插件远程部署项目到tomcat中时遇到错误,
开始时
1.安装tomcat
准备tomcat,端口为默认8080,所在服务器IP为xxx.xx.xxx.xxx. 首先去配置tomcat的conf目录下的tomcat-user.xml,连接服务器之后进入到conf目录下,然后输入:vi tomcat-user.xml,然后在指定的内容里输入(千万不要输入注释里面,不然没有效果):
-
<role rolename="manager-gui"/>
-
<role rolename="manager-script"/>
-
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script" />
注:"manager-gui"与"manager-script"必须填写。
然后是maven 的setting,xml 配置
-
<server>
-
<id>tomcat7</id>
-
<username>tomcat</username> <!-- tomcat-user.xml 中的username-->
-
<password>tomcat</password> <!-- tomcat-user.xml 中的password-->
-
</server>
2.项目pom.xml配置
pom文件中加入如下插件配置:
-
<!-- Tomcat 自动部署 plugin -->
-
<plugin>
-
<groupId>org.apache.tomcat.maven</groupId>
-
<artifactId>tomcat7-maven-plugin</artifactId>
-
<version>2.2</version>
-
<configuration>
-
<port>8080</port> <!-- 项目的端口-->
-
<path>/OvertimeReport</path> <!-- web项目的项目名称-->
-
<uriEncoding>UTF-8</uriEncoding>
-
<url>http://localhost:8080/manager/text</url> <!-- 对应的 tomcat manager的接口-->
-
<server>tomcat7</server> <!-- setting.xml 的server id-->
-
<username>admin</username> <!-- tomcat-user.xml 的 username -->
-
<password>123456</password> <!-- tomcat-user,xml 的 password -->
-
</configuration>
-
</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`来重新部署