在Maven项目中实现热部署
wangyq
使用maven作为项目管理工具,以jetty-maven-plugin插件作为内置的J2EE容器进行web项目开发,在很多时候需要实现项目代码的热部署,包括java编译后的class文件,Css\Js\Html等静态资源,视图模板如FreeMarker、Velocity、Httl等,都需要实现热部署,下面讲解下实际开发工作中的解决办法:
1、使用 jetty-maven-plugin插件作为项目内嵌容器的话,是没法直接使用Myeclpse10自带的Servers面板中的部署功能,这时为了避免每次自己手动去执行“Run as -->Maven build-->clean compile package...”等命令,需要自己配置一个外部工具来提供一个快捷的启动方式,配置步骤如下:点击菜单“Run-->External Tools-->External Tools Configurations”,
在Main标签中输入Maven的安装目录地址,Arguments中填入"Jetty:run"的命令,Working Directory选择当前正在开发的项目,在Environment标签中,添加MAVEN_OPTS标签,标签值为“-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=4010,server=y,suspend=y”,解释下suspend=y表示当遇到代码中打的断点时挂起当前线程以进行调试,Server=y表示已服务器模式运行(相对于client模式),addres=4010表示通过该端口对提供监听(4000端口会被QQ占用不推荐),-Xdebug是通知JVM工作在DEBUG模式下,-Xrunjdwp是通知JVM使用(java debug wire protocol)来运行调试环境。该参数同时了一系列的调试选项:transport指定了调试数据的传送方式,,dt_socket是指用SOCKET模式,另有dt_shmem指用共享内存方式,其中,dt_shmem只适用于Windows平台。然后在Commen标签中,选中Display in favorites menu(External Tools),这样该工具就会在控件工具栏中显示出来,可以直接点击使用了;
2、使用maven管理项目的时候,需要通过调用remote java Application实现对本机上运行的maven项目的运行监控,需要配置的过程如下,选中项目右键-->Debug AS-->debug configurations 后在面板中选择“Remote Java Application”新建一个配置:
在port中设置和MAVAEN_OPTS中相同的端口号,在Commen标签中选择在Display in favorites menu(Debug),就可以了;
3、设置Jetty的一些参数,以实现热部署;Jetty启动时候需要读取webdefault.xml文件的内容,在webdefault.xml定义useFileMappedBuffer为false即可实现(开发时建议设为false,正式运行的时候建议设为true以提高系统响应速度),另外建议将 <locale-encoding-mapping>中zh的编码也设置成UTF-8(默认是GBK,有时候会出现乱码);该xml文件提供在附件中了,用户可以自己去jetty的jar包中找该文件修改下参数值就可以了;修改完成后,将该文件放在src/main/resources/下面,然后在POM.XML中配置该文件:
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>8.1.12.v20130726</version> <configuration> <scanIntervalSeconds>10</scanIntervalSeconds> <webAppConfig> <contextPath>/gtcloud</contextPath> <defaultsDescriptor>src/main/resources/webdefault.xml</defaultsDescriptor> </webAppConfig> </configuration> </plugin>
这一步实现完成后能完成对静态资源(CSS\JS\IMAGE等)的热部署;如果需要实现对class文件的热部署,还需要在之前的外部工具的环境变量中添加参数,在MAVEN_OPST中继续添加“-Djetty.reload=automatic -Djetty.scanIntervalSeconds=5”以实现对java文件的热部署;
4、另外还有一些模板文件如Velocity\Freemarker\Httl等,因为存放位置是在WEB-INF/templates下面,很多时候文件改动也不能实现热部署,这时候需要结合具体的模板来修改,比如Httl(这是淘宝推荐使用的视图模板技术)可以在MAVEN_OPTS中继续追加参数“-Dhttl.reloadable=true”来实现,其他的模板基本实现也都差不多;
最终的MAVEN_OPTS中的参数值为:“-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=4010,server=y,suspend=y -Djetty.reload=automatic -Djetty.scanIntervalSeconds=5 -Dhttl.reloadable=true”;
5、最后一步验证以上步骤是否正常,启动服务(启动外部程序实现对指定端口的监听),然后在启动Remote Java Application来实现运行监控;
点击按钮后console会打印Listening for transport dt_socket at address: 4010 的提示信息
点击后会使出容器启动信息和项目信息;这时候更改任何文件,刷新页面,页面都会显示出最新效果~
结合上面4个步骤,项目中所遇到的所有文件的修改都能实现热部署了,也不用借助于JRebel等插件提供的额外功能,一切都是这么滴简单~~~
--------------------------------------
ps:不好意思,我之前上传的附件中没有把webdefault.xml的配置文件放上来,抱歉啊,现在补上了;class文件的自动加载实际上是有赖于这个xml文件的。