Ant编译java web环境搭建

来源:互联网 发布:股票行情软件 编辑:程序博客网 时间:2024/06/08 11:16

最近项目需要将java工程的打包编译进行自动化处理,而不是人工通过eclipse打war包替换之前的发布包,为此,学习了一下ant工具。

1.linux上安装ant.

  从Apache Ant官网上面下载Ant软件包,http://ant.apache.org/bindownload.cgi。拷贝至linux环境下某一个目录,一般是/usr/local目录,将bin路径添加至linux的PATH中:

 

如果java环境已经搭建好,则可以直接运行ant命令便可,ant需要一个配置文件build.xml,默认会在当前路径寻找。


2.build.xml文件内容说明

(1)目录结构

官方文档上目录结构示例如下:

<project name="HelloWorld" basedir="." default="main">    <property name="src.dir"     value="src"/>    <property name="build.dir"   value="build"/>    <property name="classes.dir" value="${build.dir}/classes"/>    <property name="jar.dir"     value="${build.dir}/jar"/>    <property name="main-class"  value="oata.HelloWorld"/>    <target name="clean">        <delete dir="${build.dir}"/>    </target>    <target name="compile">        <mkdir dir="${classes.dir}"/>        <javac srcdir="${src.dir}" destdir="${classes.dir}"/>    </target>    <target name="jar" depends="compile">        <mkdir dir="${jar.dir}"/>        <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">            <manifest>                <attribute name="Main-Class" value="${main-class}"/>            </manifest>        </jar>    </target>    <target name="run" depends="jar">        <java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>    </target>    <target name="clean-build" depends="clean,jar"/>    <target name="main" depends="clean,run"/></project>
(2)使用经验

build.xml中的文档元素基本都是对应linux中的一些命令,比如<mkdir dir="/opt" />,就相当于在linux中执行一个mkdir /opt的linux命令。

准备java编译环境:

<project basedir="." default="publish" name="MC">  <!-- 指明根路径为当前路径-->

<target name="init" description="设置初始化打 war 包需要的路径变量">  
        <property name="name" value="MC"/>  
        <property name="src" value="${basedir}/MC/src"/>      <!-- -java源文件的路径->
        <property name="lib" value="${basedir}/MC/WebRoot/WEB-INF/lib"/>  <!-- -web工程的所有lib的路径-->
        <property name="webapp" value="${basedir}/MC/WebRoot"/>  <!-- web工程的WebRoot路径 -->
        <property name="cofig" value="${basedir}/MC/resource/"/>       <!-- web工程的存放所有配置文件的目录-->
          
        <property name="build.src" value="${basedir}/temp/MC/src"/>  <!--存放java源文件的临时路径 -->
        <property name="build.dest" value="${basedir}/temp/MC/WEB-INF/classes"/>  <!--java文件编译后生成的class文件存放的路径 -->
        <property name="buildwar.dest" value="${basedir}/temp/MC"/>  <!--存放工程的总路径-->
        <property name="jar.dest" value="${basedir}/temp/jar"/>  
        <property name="war.dest" value="${basedir}/temp/war"/>  <!--存放编译后的war文件-->
        <property name="j2ee.lib" value="${basedir}/j2eejar/"/>        <!--存放编译java文件需要的java的jar包-->
  
        <property name="tomcat.home" value="/opt/nmc/NMC/tomcat"/>  
         

        <!--将编译java文件所需要的所有java包都拷贝到指定目录中,后面编译java文件通过path的id引用-->
        <path id="classpath">  
            <fileset dir="${lib}">  
                <include name="**/*.jar"/>  
            </fileset>
            <fileset dir="${j2ee.lib}">
                <include name="**/*.jar"/> <!--相当于把include的文件都拷贝到fileset指定的dir目录中-->
            </fileset>  
        </path>  
      </target>  

 <!--每一个xml元素相当于一个linux命令,依次创建目录,以及进行文件夹拷贝,在linux命令行窗口中,执行ant prepare命令就可以进行编译之前的创建工作,depends配置表示此个命令需要依赖的操作-->   

  <target name="prepare"depends="init" description="创建打包需要的路径,拷贝源文件到打包路径下">  
        <mkdir dir="${build.src}"/>  
        <mkdir dir="${build.dest}"/>  
        <mkdir dir="${buildwar.dest}"/>  
        <mkdir dir="${jar.dest}"/>  
        <mkdir dir="${war.dest}"/>  
        <copy todir="${build.src}">  
            <fileset dir="${src}"/>  
        </copy>  
        <copy todir="${buildwar.dest}">  
            <fileset dir="${webapp}"/>  
        </copy>  
        <copy todir="${build.dest}">
            <fileset dir="${cofig}"/><!--将fileset指定的dir所代表的的目录内容拷贝到todir目录中-->
        </copy>
    </target> 

 

   <!--开始编译java文件,在linux命令行窗口中,执行ant build命令就可以进行文件编译-->

   <target name="build" depends="prepare" description="编译 java 文件,拷贝 properties 属性配置文件到编译后的路径下">  
        <javac srcdir="${build.src}" destdir="${build.dest}" includeantruntime="false">  
            <classpath refid="classpath"/>  
        </javac>  
    </target> 


   <!-- 开始打war包,在linux命令行窗口中,执行ant antwar命令就可以进行制作war包的操作 -->

    <target name="antwar" depends="cpmapper" description="打 war 包,不将 java 文件打入包内">  
        <delete dir="${build.src}"/>
        <war warfile="${war.dest}/MC.war" webxml="${buildwar.dest}/WEB-INF/web.xml">  
            <lib dir="${buildwar.dest}/WEB-INF/lib"/>  
            <classes dir="${build.dest}"/>  
            <fileset dir="${buildwar.dest}"/>  
        </war>  
    </target>

在我的项目中,由于使用mybatis配置,java的src包中,包含有很多mybatis的配置,所以需要将这些xml配置文件拷贝到相应的src目录中:

<!-- 在linux命令行窗口中,执行ant cpmapper命令就可以进行mybatis文件拷贝-->

<target name="cpmapper" depends="build" description="将mapper对应的xml文件拷入相应classes的mapper类目录">  
        <copy todir="${build.dest}/com/cstor/network/account/mapper">  
            <fileset dir="${src}/com/cstor/network/account/mapper">
    <include name="*.xml"/>
   </fileset>  
        </copy>  
        <copy todir="${build.dest}/com/cstor/network/alarm/mapper">  
            <fileset dir="${src}/com/cstor/network/alarm/mapper">
    <include name="*.xml"/>
       </fileset>  
        </copy>
<copy todir="${build.dest}/com/cstor/network/cloudspace/mapper">  
            <fileset dir="${src}/com/cstor/network/cloudspace/mapper">
    <include name="*.xml"/>
            </fileset>  
        </copy>
<copy todir="${build.dest}/com/cstor/network/device/mapper">  
            <fileset dir="${src}/com/cstor/network/device/mapper">
    <include name="*.xml"/>
   </fileset>  
        </copy>
<copy todir="${build.dest}/com/cstor/network/fault/mapper">  
            <fileset dir="${src}/com/cstor/network/fault/mapper">
    <include name="*.xml"/>
   </fileset>  
        </copy>
<copy todir="${build.dest}/com/cstor/network/logger/mapper">  
            <fileset dir="${src}/com/cstor/network/logger/mapper">
   <include name="*.xml"/>
  </fileset>  
        </copy>
<copy todir="${build.dest}/com/cstor/network/login/mapper">  
            <fileset dir="${src}/com/cstor/network/login/mapper">
    <include name="*.xml"/>
   </fileset>  
        </copy>
    </target>  

 war完成之后,将war包发布到tomcat中:

<!--在linux命令行窗口中,执行ant publish命令就可以将war包拷贝到tomcat的webapps中-->

<target name="publish" depends="antwar,clean" description="发布 war 包至 tomcat 目录下">  
        <copy todir="${tomcat.home}/webapps">  
            <fileset dir="${war.dest}">  
                <include name="**/*.war"/>  
            </fileset>  
        </copy>  
    </target>

最后,清楚打包的临时文件,完成编译java web工程并将war包部署到tomcat中的任务:

<!--在linux命令行窗口中,执行ant clean命令就可以删除指定的目录-->

<target name="clean" depends="init" description="清除打包用临时文件">  
        <delete dir="${build.src}"/>  
        <delete>  
            <fileset dir="${build.dest}" includes="**/*.classes"/>  
        </delete>  
        <delete dir="${buildwar.dest}"/>  
    </target>  


由于ant命名都在build.xml中定义,而且有依赖属性配置,执行一个ant命名,ant会自行先执行它配置的depends中的target,所以最终只要执行ant publish,就可以完成操作。

总结:

   使用ant命令可以很方便的对ant命令进行编译,就相当于一个xml版本的shell语言一样,比较好用,配置简单,结合相应的shell脚本,就可以完成web工程的打包操作



原创粉丝点击