热部署:所谓热部署,就是在系统正在运行的时候升级软件,却不需要重新启动应用。
Tomcat热部署方式一:
直接将一个web项目打成一个war包,并将war包放入tomcat的webapps目录下,此时tomcat服务器会自动将次war包解压并在服务器上进行部署发布。
Tomcat热部署方式二:
使用Tomcat自带的Tomcat Manager来对tomcat上的web项目进行管理。
找到tomcat-users.xml这个配置文件,在这个配置文件的最下方,有如下这么几行标签:
<tomcat-users>
<!--
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
<user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
<user username="role1" password="<must-be-changed>" roles="role1"/>
-->
</tomcat-users
- manager-gui:允许访问html接口(即URL路径为/manager/html/*)
- manager-script:允许访问纯文本接口(即URL路径为/manager/text/*)
- manager-jmx:允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)
- manager-status:允许访问Tomcat只读状态页面(即URL路径为/manager/status/*)
以一个具体的配置为例:
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manage-script"/>
最后,启动Tomcat服务器,访问http://localhost:8080/manager,然后输入用户名密码,此时用户名和密码都是:tomcat
登入成功能够以客户端的形式来进行tomcat上web项目,找到如下所示这一栏:
此处可以将一个war包上传到服务器中,上传成功后便会自动部署并发布(ps:有关Tomcat Manager的更多用处,有兴趣的朋友可以自己再去了解一下,此处主要说明tomcat的热部署)。
Maven项目下进行Tomcat热部署:
1、在pom文件中配置如下插件即可:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 端口号,可自定义 -->
<port>8080</port>
<!-- 项目访问路径 -->
<path>/qing</path>
<!-- Tomcat Manager的url访问路径,固定写法 -->
<url>http://localhost:8080/manager/text</url>
<!-- Tomcat Manager的用户名和密码 -->
<username>tomcat</username>
<password>tomcat</password>
</configuration>
</plugin>
</plugins>
</build>
2、进入Tomcat的bin目录启动tomcat服务器,或者在myeclipse、eclipse中启动tomcat服务器
3、在eclipse或者myeclipse中右键点击需要热部署的web项目,选择:Run As–>Maven build..,输入:
3.最后点击Run,然后访问:http://localhost:8080/qing/index.html,能够成功访问项目说明项目部署成功。
注:
1、想要在maven项目中进行tomcat的热部署,必须要开启Tomcat Manager
2、部署到远程服务器也是相同的道理,只需要将localhost改为tomcat所在的服务器IP即可
问题:
问题1:
在部署到远程服务器时,出现以下问题:
[INFO] I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error
[INFO] Retrying request
Uploading: http://******/manager/text/deploy?path=%2F
4098/35084 KB
[INFO] I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error
[INFO] Retrying request
Uploading: http://******/manager/text/deploy?path=%2F
4096/35084 KB
经过查询资料后发现,这是由于Tomcat的远程地址拦截器造成的结果,默认情况下,Tomcat的Manager和Host-Manager只接受本机的请求,要让它接受远程的请求,需要添加manager.xml的配置。
在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属性中设置规则。具体规则设置见下面的链接:
详情链接
问题2:
同时在解决问题的过程中也考虑到多次重复部署带来的问题,也就是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:端口号/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
来重新部署