jetty热部署

Maven是一个非常优秀的工具,在Maven出现之前,一个项目如果业务很多,很复杂,整个项目就非常庞大。这会造成如下几个问题:
1、项目后期维护成本大,新加一个需求需要全盘考虑会不会影响其他的业务逻辑;
2、开发效率低下,改动一个Java文件需要重启Tomcat (Jetty等)服务器 ,重新编译整个项目,编译会花去一定的时间,程序员开发的时间会大大减少;
3、所有的业务代码和非业务代码紧密耦合在一起,无法拆分;
4、jar文件冲突,不同的业务代码依赖jar的版本无法做到统一。

Maven出现后,很好的解决了上述问题。使用Maven后,一个大的项目被拆分成小的模块,这样程序员可以专注于某个模块,开发效率大大提高。同时程序员改了某个模块后,只需编译这个模块,这样减少了编译时间。Maven也很好的管理jar,所有的jar可以通过自己构建私服统一管理,冲突问题得以解决。

写到这里也许你会问,Maven似乎已经实现分模块编译和打包的功能,实现了热部署,还要在Maven上做什么文章?确实,Maven解决了“热部署”。一般情况下不需要再做什么文章了,分模块已经大大的提高了开发效率。如果一个项目拆分成几个模块后,模块不能继续再分了(模块分的越多也不是很好,不便于管理),但是模块还是很大,这时候有点问题了!!

于是就有人提出,JVM每次编译Java文件只编译.class文件改动的文件,这样会提高JVM编译效率。JRebel插件是其中一种,可以监控哪些Java文件被修改过,原理就不叙述了,可以百度相关文章阅读。

本文只讨论Maven插件( Tomcat + JRebel)实现Web项目热部署(增量部署)功能。其他插件如Jetty也可以实现热部署,Maven的配置类似,本人也成功使用Jetty插件实现热部署,鉴于篇幅原因,这里就不在赘述。开发中选择Tomcat还是Jetty依项目而定,不过 一般推荐使用Jetty插件,Jetty比Tomcat 更轻量级,大多数情况下Jetty完全可以满足需求。需要注意的是,JBoss插件的支持不是很好,目前本人未能成功用JBoss插件实现分模块打包,如果你实现了用JBoss插件分模块打包,并可以正常的运行项目,欢迎分享给大家。

好了,开始进入正题,Tomcat + JRebel 插件实现热部署。

1、配置编译插件:

  1. <plugin>  
  2.     <groupId>org.apache.maven.plugins</groupId>  
  3.     <artifactId>maven-compiler-plugin</artifactId>  
  4.     <version>2.3.2</version>  
  5.     <configuration>  
  6.         <source>1.7</source>  
  7.         <target>1.7</target>  
  8.     </configuration>  
  9. </plugin>  

2、配置打源码插件(可选项):
  1. <plugin>  
  2.     <groupId>org.apache.maven.plugins</groupId>  
  3.     <artifactId>maven-source-plugin</artifactId>  
  4.     <version>2.1.1</version>  
  5.     <configuration>  
  6.         <attach>true</attach>  
  7.     </configuration>  
  8.     <executions>  
  9.         <execution>  
  10.             <phase>compile</phase>  
  11.             <goals>  
  12.                 <goal>jar</goal>  
  13.             </goals>  
  14.         </execution>  
  15.     </executions>  
  16. </plugin>  

3、配置Tomcat 插件,关闭Tomcat 本身的热部署功能:
  1. <plugin>  
  2.     <groupId>org.apache.tomcat.maven</groupId>  
  3.     <artifactId>tomcat7-maven-plugin</artifactId>  
  4.     <version>2.2</version>  
  5.     <configuration>  
  6.         <port>8888</port>  
  7.         <path>/uums-web</path>  
  8.         <uriEncoding>UTF-8</uriEncoding>  
  9.         <!-- 监控web.xml文件 -->  
  10.         <contextFile>${basedir}/src/main/webapp/WEB-INF/web.xml</contextFile>  
  11.         <useTestClasspath>false</useTestClasspath>  
  12.           
  13.         <webAppConfig>  
  14.             <contextPath>/${project.artifactId}</contextPath>  
  15.             <extraClasspath>    
  16.                 ../uums-common/target/classes;    
  17.             </extraClasspath>  
  18.         </webAppConfig>  
  19.           
  20.         <scanTargets>    
  21.             <scanTarget>../uums-common/target/classes</scanTarget>  
  22.         </scanTargets>  
  23.           
  24.         <scanTargetPatterns>  
  25.             <scanTargetPattern>  
  26.                 <directory>src/main/java</directory>  
  27.                 <includes>  
  28.                     <include>**/*.java</include>  
  29.                 </includes>  
  30.             </scanTargetPattern>  
  31.             <scanTargetPattern>  
  32.                 <directory>src/main/resources</directory>  
  33.                 <includes>  
  34.                     <include>**/*.properties</include>  
  35.                 </includes>  
  36.                 <excludes>  
  37.                     <exclude>**/*.xml</exclude>  
  38.                 </excludes>  
  39.             </scanTargetPattern>  
  40.         </scanTargetPatterns>  
  41.         <!-- 关闭tomcat自身的热部署 -->  
  42.         <scanIntervalSeconds>0</scanIntervalSeconds>  
  43.         <webAppSourceDirectory>${basedir}/src/main/webapp</webAppSourceDirectory>  
  44.     </configuration>  
  45. </plugin>  
  
4、JRebel插件Maven配置:
  1. <plugin>    
  2.     <groupId>org.zeroturnaround</groupId>    
  3.     <artifactId>jrebel-maven-plugin</artifactId>    
  4.     <version>1.1.5</version>    
  5.     <executions>    
  6.         <execution>    
  7.             <id>generate-rebel-xml</id>    
  8.             <phase>process-resources</phase>    
  9.             <goals>    
  10.                 <goal>generate</goal>    
  11.             </goals>    
  12.         </execution>    
  13.     </executions>    
  14.     <configuration>    
  15.         <rebelXmlDirectory>${basedir}/src/main/webapp/WEB-INF/classes</rebelXmlDirectory>    
  16.     </configuration>    
  17. </plugin>  

5、指定编译后文件的存放路径。
因 为Tomcat 默认src/main/webapp为 web应用的根目录,而maven compile目标后的默认classpath在target文件夹下,就造成jrebel.xml无法兼顾Tomcat 默认的是webapp中的 classes为web应用的根目录,而Maven默认是target目录,所以需要修改该Maven的默认classes目录。
  1. <outputDirectory>${basedir}/src/main/webapp/WEB-INF/classes</outputDirectory>  

6、在Eclipse 里下载JRebel插件:
点击Help->Eclipse Marketplace,下载JRebel for Eclipse插件。



7、配置jrebel.jar的路径
点击Windows->Prefrences->JRebel->Advanced,在JRebel agent里指定下载好的jrebel.jar的路径。



8、配置VM参数:



使用maven命令: tomcat7:run,启动Tomcat ,出现如下信息,则说明JRebel配置成功。



在uums-web的/WEB-INF/classes目录下生成了一个rebel.xml文件,该文件会监控如下两个目录:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  3.    xmlns="http://www.zeroturnaround.com"   
  4.    xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd">  
  5.   
  6.     <classpath>  
  7.         <dir name="F:/workspace/uums/uums-web/src/main/webapp/WEB-INF/classes"></dir>  
  8.     </classpath>  
  9.   
  10.     <web>  
  11.         <link target="/">  
  12.             <dir name="F:/workspace/uums/uums-web/src/main/webapp"></dir>  
  13.         </link>  
  14.     </web>  
  15.   
  16. </application>  



启动Tomcat ,在浏览器地址栏输入 http://localhost:8888/uums-web/,显 示默认页面,这时修改LoginAction.java和LoginDaoImpl.java文件,发现只加载LoginAction.java和 LoginDaoImpl.java文件,不需要重启Tomcat 重新编译整个模块。实现了只编译修改的.class文件,大功告成!


上 面似乎没有任何问题,但是,问题还是出现了,比如修改了uums-common模块(uums-common是uums-web依赖的模块)里的Java 文件,发现并没有reload修改的那个文件。上述配置只实现了reload uums-web模块修改的Java文件,其依赖的模块被修改并不能被reload,需要重新编译uums-common模块。这个问题一直困扰了我很 久,经过查阅资料和不断地测试,终于实现了不用重新编译uums-common模块也可以实现reload修改的Java文件,只需在uums-web模 块的pom.xml文件添加如下的配置即可。注意,如果uums-web依赖多个模块,则需要在每个依赖的模块的后面加上“;”。
  1. <webAppConfig>  
  2.     <contextPath>/${project.artifactId}</contextPath>  
  3.     <extraClasspath>    
  4.         ../uums-common/target/classes;    
  5.     </extraClasspath>  
  6. </webAppConfig>  
  7.   
  8. <scanTargets>    
  9.     <scanTarget>../uums-common/target/classes</scanTarget>  
  10. </scanTargets>  


重启Tomcat,这次修改uums-common模块的Java文件,发现可以被reload,至此热部署得以实现。
由于本人能力有限,问题在所难免,恳请各位批评指正!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值