如何搭建基于tomcat的Maven多modules项目的hot deploy开发快速环境
网上大多都是打包war然后让tomcat自动reload来发布,这个是没错,发布test/uat/prod环境都是这样的。but,对于我们平时的开发,项目大了reload一下不是几分钟就可以完成的,所以需要一个快速便捷的deploy方式来满足我们平时的需要。
本文写的是我的解决方式,供大家参考,探讨和改进。
Tomcat(apache-tomcat-7.0.42)
conf/server.xml
添加项目docBase:
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
...
<Context docBase="C:\work\SCMSVN\jtscm\com.ibm.scm.g1.int\com.ibm.scm.war.portal\target\portalTD" path="/portalTD" reloadable="false"/>
<Context docBase="C:\work\SCMSVN\jtscm\com.ibm.scm.g2.workspace\com.ibm.ais.war.common.homepage\target\homepage" path="/homepageTD" reloadable="false"/>
</Host>
reloadable设为false,hot deploy是基于jrebel的,所以不需要每次reload。
bin/startup.cmd
设置远程debug,端口8001
SET JAVA_OPTS=%JAVA_OPTS% -Xdebug -Xrunjdwp:transport=dt_socket,address=8001,server=y,suspend=n
设置jrebel安装目录,版本JRebel 5.5.2,lic**版
set REBEL_HOME=D:\app\jrebel
SET JAVA_OPTS=%JAVA_OPTS% -javaagent:%REBEL_HOME%\jrebel.jar -Drebel.jersey_plugin=true
Eclipse(Indigo)
远程debug配置
配置ant脚本,利用ant脚本自动化运行maven命令,或者直接copy代码到tomcat的项目目录,下面会具体说明。
新建一个单独的ant项目:
在view里加入build.xml文件:
引入ant-contrib.jar插件包,里面有for之类的taskdef,这里要从ant build...的classpath里加入而不是直接从项目的property里加入。
Build.xml思路
1. Mvn install依赖的module,然后mvn package主(war)项目,然后再unzip依赖module(此时已经包含最新的update)到tomcat的docBase目录
2. 直接copy html/js/css等静态文件,compile java文件到tomcat的docBase目录
参考:
<!-- mvn install所有修改的dependency modules -->
<for list="${dir.svn}/com.ibm.ais.g1.dev/com.ibm.ais.rss.common.homepage"
param="module" delimiter=",">
<sequential>
<maven basedir="@{module}" options="" goal="install" resultproperty="maven.build.result"/>
</sequential>
</for>
<!-- mvn package主项目 -->
<maven basedir="${dir.svn}/com.ibm.scm.g2.workspace/com.ibm.ais.war.common.homepage"
options="" goal="package" resultproperty="maven.build.result"/>
<!-- unzip所有修改的dependency modules -->
<for list="${dir.homepage.webinf}/lib/com.ibm.ais.rss.common.homepage-1.0.0.0-SNAPSHOT.jar"
param="module" delimiter=",">
<sequential>
<unzip src="@{module}" dest="${dir.homepage.webinf}/classes"/>
</sequential>
</for>
<!-- 用的是local的maven,所以conf/setting.xml文件要和eclipse里配置的一致 -->
<macrodef name="maven">
<attribute name="options" default="" /> <!-- -X 打印出详细过程 -->
<attribute name="goal" />
<attribute name="basedir" />
<attribute name="resultproperty" default="maven.result" />
<element name="args" implicit="true" optional="true" />
<sequential>
<java classname="org.codehaus.classworlds.Launcher" fork="true"
dir="@{basedir}" resultproperty="@{resultproperty}">
<jvmarg value="-Xmx512m"/>
<classpath>
<fileset dir="${maven.home}/boot">
<include name="*.jar" />
</fileset>
<fileset dir="${maven.home}/lib">
<include name="*.jar" />
</fileset>
</classpath>
<sysproperty key="classworlds.conf" value="${maven.home}/bin/m2.conf" />
<sysproperty key="maven.home" value="${maven.home}" />
<arg line="--batch-mode @{options} @{goal}" />
</java>
</sequential>
</macrodef>
开发基本流程:
1.修改js,java文件
2.ant build.xml
3.tomcat hotdeploy class file (jrebel)
4.test
5.debug if need