`
wang5598
  • 浏览: 111268 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Maven项目中的热部署

阅读更多

在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文件的。

 

  • 大小: 107.5 KB
  • 大小: 77 KB
  • 大小: 55.8 KB
  • 大小: 19.6 KB
  • 大小: 24.5 KB
1
0
分享到:
评论
3 楼 意中人_ix 2017-11-09  
到最后一步,执行remote_gtcloud后出现问题:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13.642 s
[INFO] Finished at: 2017-11-09T14:08:30+08:00
[INFO] Final Memory: 10M/122M
[INFO] ------------------------------------------------------------------------
[ERROR] No plugin found for prefix 'Jetty' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (C:\Users\Administrator\.m2\repository), nexus (http://***********/repository/maven-public/)] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoPluginFoundForPrefixException



2 楼 wang5598 2014-07-04  
这个需要把webdefault.xml文件放到webAppConfig的配置中的。之前忘记上传webdefault.xml文件了,抱歉
1 楼 bendan123812 2014-05-09  
为什么我这样弄了以后修改java文件还是会自动重启服务?

相关推荐

Global site tag (gtag.js) - Google Analytics