CruiseControl本身不具有打包项目的功能,而且它的核心很小,但是CruiseControl的强大之处在于它的强大的扩展性,与Ant集成尤显如此。
我们要将Web项目打包成WAR,必须要借助Ant来实现。
1、首先我们来写一段Ant的脚本,为了与持续集成的配置文件build.xml区分开,在此我将Ant打包的功能单独放在一个配置文件中,此文件名为"publisher.xml"。
pubilsher.xml的脚本很简单,关于脚本的介绍与功能在文件中已用注释的方式进行说明,具体请看源代码:
<project name="RBAC" default="war" basedir=".">
<property name="classes" value="build/classes"/>
<property name="build" value="build"/>
<property name="lib" value="WebContent/WEB-INF/lib/"/>
<!--项目依赖的第三方jar包路径-->
<path id="lib_classpath">
<fileset dir="WebContent/WEB-INF/lib/">
<include name="*.jar"/>
</fileset>
</path>
<target name="clean" description="删除build目">
<delete dir="build"/>
</target>
<target name="compile" depends="clean" description="建立${classes}路径,并编译class文件到${classes}路径下">
<mkdir dir="${classes}"/>
<!--执行编译-->
<javac srcdir="src" destdir="${classes}">
<classpath refid="lib_classpath"/> <!--引入项目依赖的第三方jar包-->
</javac>
</target>
<target name="prepare" description="将Struts、Spring、Hibernate、properties等配置文件拷贝到${classes}路径下">
<!--拷贝所有的xml配置文件-->
<copy todir="${classes}">
<fileset dir="src">
<include name="**/*.xml"/>
</fileset>
</copy>
<!--拷贝所有的属性文件-->
<copy todir="${classes}">
<fileset dir="src">
<include name="**/*.properties"/>
</fileset>
</copy>
</target>
<target name="war" depends="compile,prepare" description="打包war">
<war destfile="${build}/RBAC.war" webxml="WebContent/WEB-INF/web.xml">
<!--拷贝WebContent下除了Web-INF和META-INF的两个文件夹-->
<fileset dir="WebContent" includes="**/*.jsp"/>
<!--拷贝lib目录下的jar包-->
<lib dir="${lib}"/>
<!--拷贝${classes}下的class文件-->
<classes dir="${classes}"/>
</war>
</target>
</project>
这个脚本确实很简单吧!
Note:依赖的Jar包很重要,如果你的项目引入了第三方的Jar包,如:annotations-api.jar,请一定要引入,否则将会编译失败。
2、Ant脚本编写好了,那么如何让这个Ant脚本在适当的时候运行呢?
我们的想法是:CC在build项目之后,如过成功,便将项目打包成War,那么我们就需要用CC来控制这段脚本的运行。
稍微熟悉CC的人都知道,CC有一个很重要的element(元素)---<publishers>,Publishers是在build完成之后运行的,而无论CC的build是成功还是失败,它都会运行。如要让Ant脚本在CC的build执行成功后运行的话,我们可以找到一个子元素<onsuccess/>,它的意思是当build成功后,执行此代码段。那么我们就可以编写代码了:
<publishers>
<onsuccess>
</onsuccess>
</publishers>
紧接着,我们在<onsuccess>中添加调用Ant脚本的代码,如下:
<antpublisher anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/publisher.xml"/>
完整的脚本如下:
<publishers>
<onsuccess>
<antpublisher anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/publisher.xml"/>
</onsuccess>
</publishers>
这样,我们的Ant脚本就能执行了,打开你的CC,等待第一成功build之后,你会发现你的project/项目/目录下多了一个build文件夹,文件夹类就是编译后的结果。
Note:CC中的代码也可使用以下代码代替:
<publishers>
<antpublisher anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/publisher.xml" thisbuildsuccessful="true"/>
</publishers>
Notice:本人菜鸟,代码拙劣,请海涵。