编译java web工程的ant脚本模板
流程、自动化工具的好处,就是能让我们在保证效率的同时,也不容易犯一些低级错误。用ant来编译java web工程就是这样,能让我们在发布环节,更加规范、高效。这里分享一套,我所使用的ant脚本
一、使用的前提
你的代码目录结构应该是这样:
resources
-----common 不管测试环境,还是正式环境,都是一样的配置文件,如web.xml,strtus.xml
-----daily 测试环境配置文件,如应用、数据库的配置文件
------formal 正式环境配置文件
WebRoot
-------WEB-INF
==lib 依赖包
<?xml version="1.0" encoding="utf-8" ?>
<project name="apprelease" default="build" basedir="." >
<property name="release.dir" value="apprelease"/>
<property name="release.inf.dir" value="${release.dir}/WEB-INF"/>
<property name="release.classes.dir" value="${release.inf.dir}/classes"/>
<property name="release.lib.dir" value="${release.inf.dir}/lib"/>
<property name="release.file" value="${release.dir}.zip"/>
<property name="webroot.dir" value="WebRoot"/>
<property name="webroot.class.dir" value="WEB-INF/classes"/>
<property name="src.dir" value="src"/>
<property name="resources.dir" value="resources"/>
<property name="lib.dir" value="WEB-INF/lib"/>
<property name="classes.dir" value="bin"/>
<property name="daily" value="daily"/>
<property name="formal" value="formal"/>
<!--
设置类路径
-->
<path id="compile.classpath">
<fileset dir="${webroot.dir}/${lib.dir}">
<exclude name="**/.svn"/>
<exclude name="test/"/>
</fileset>
</path>
<target name="build" description="Build this project" depends="clean,compile">
<antcall target="buildWithType">
<param name="buildtype" value="${formal}"/>
</antcall>
<antcall target="buildWithType">
<param name="buildtype" value="${daily}"/>
</antcall>
</target>
<target name="clean" description="Remove all generated files.">
<delete dir="${classes.dir}"/>
<delete dir="${formal}-${release.dir}"/>
<delete file="${formal}-${release.file}"/>
<delete dir="${daily}-${release.dir}"/>
<delete file="${daily}-${release.file}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac encoding="utf-8" srcdir="${src.dir}" classpathref="compile.classpath" destdir="${classes.dir}"/>
</target>
<target name="buildWithType" description="Build formal or daily">
<property name="buildtype" value="formal"/>
<copy todir="${buildtype}-${release.classes.dir}">
<fileset dir="bin">
<exclude name="**/.svn"/>
<exclude name="*.properties"/>
<exclude name="*.property"/>
<exclude name="*.xml"/>
</fileset>
<!---从resources/daily或者resources/formal(daily)目录下,拷贝配置文件到classes目录 -->
<fileset dir="${resources.dir}/${buildtype}">
<include name="log4j.properties"/>
<include name="databases.properties"/>
<include name="application.properties"/>
<include name="struts.xml"/>
<include name="shiro.ini"/>
<include name="mess.properties"/>
</fileset>
<!---从resources/common目录,拷贝配置文件到classes目录 -->
<fileset dir="${resources.dir}/common">
<include name="key.ini"/>
<include name="struts.xml"/>
</fileset>
</copy>
<copy todir="${buildtype}-${release.inf.dir}">
<!---从resources/common目录,拷贝配置文件到WEB-INF目录 -->
<fileset dir="${resources.dir}/common">
<exclude name="**/.svn"/>
<include name="web.xml"/>
</fileset>
<!---从resources/daily或者resources/formal(daily)目录下,拷贝配置文件到WEB-INF目录 -->
<fileset dir="${resources.dir}/${buildtype}">
<include name="beans.xml"/>
</fileset>
</copy>
<copy todir="${buildtype}-${release.dir}">
<fileset dir="${webroot.dir}">
<exclude name="**/.svn"/>
<exclude name="**/${lib.dir}/**"/>
<exclude name="**/${webroot.class.dir}/**"/>
</fileset>
</copy>
<copy todir="${buildtype}-${release.lib.dir}" flatten="true">
<fileset dir="${webroot.dir}/${lib.dir}">
<exclude name="**/.svn"/>
<include name="**/*.jar"/>
</fileset>
</copy>
<zip destfile="${buildtype}-${release.file}">
<fileset dir="${buildtype}-${release.dir}"/>
</zip>
</target>
</project>
三、脚本说明
1、会过滤掉.svn文件
2、WebRoot目录下的内容,除了WEB-INF\lib和WEB-INF\classes,其他的内容,都会拷贝到最终的zip包中
3、如果你在<copy todir="${buildtype}-${release.inf.dir}">节点中,定义了从resource目录拷贝配置文件,那么则会以resource目录的为准。例如,你在那个节点下定义了,要将resources\common\web.xml拷贝到${buildtype}-${release.inf.dir},那么,最后zip包中的web.xml,则是resources\common的那份,而不是WebRoot目录的那份
4、会生成daily 、formal两个包,区别在于,daily使用的是resources\daily中的资源,而formal则是resources\formal下的
5、每次都是全量编译java文件,这样可以避免一些问题,例如《遇过的坑-用ant编译java项目,如果static变量有修改,使用了该static变量的java文件, 不会重编译》
6、WEB-INF\lib下,可以存在二级目录,脚本执行时,会将二级目录的内容,也都拷贝到lib下,这样能避免“web容器下不会加载lib二级目录jar包”这个问题
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。