编译java web工程的ant脚本模板

流程、自动化工具的好处,就是能让我们在保证效率的同时,也不容易犯一些低级错误。用ant来编译java web工程就是这样,能让我们在发布环节,更加规范、高效。这里分享一套,我所使用的ant脚本


一、使用的前提

你的代码目录结构应该是这样:

src
resources
-----common 不管测试环境,还是正式环境,都是一样的配置文件,如web.xml,strtus.xml
-----daily 测试环境配置文件,如应用、数据库的配置文件
------formal 正式环境配置文件
WebRoot
-------web资源目录(如JS、img等)
-------WEB-INF
          ==lib 依赖包

二、脚本模板
如何修改:
1、apprelease  改为自己的应用名称
2、<copy todir="${buildtype}-${release.classes.dir}"节点,会拷贝配置文件到class目录,你需要在这个节点下,定义要拷贝的文件,增减下"include"的内容即可。如果不需要拷贝,则删除对应fileset节点
3、<copy todir="${buildtype}-${release.inf.dir}">节点,会拷贝配置文件到WEB-INF下。同上,按需修改
<?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="classes"/>

 
   <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="${classes.dir}">
               <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包”这个问题

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章