Ant构建工程需要注意两点,即工程组织以及Ant构建文件

  • 工程组织

    • 工程组织是指对一个项目工程进行合理的分层设计和组织,将测试与源代码分离
  • Ant构建文件

    • Ant的一个构建build.xml,即可以合理表达构建的每一个步骤,又能够通过xml文件描述各个层次之间的关系

Ant构建项目流程

1.项目组织以及Ant的构建文件

build before:
    src
        com.wind.doamin
           Person.java
    test
        com.wind.domain
           PersonTest.java
    lib
        juint-4.9.jar
    build.xml     

build after:
     src
        com.wind.doamin
           Person.java
    test
        com.wind.domain
           PersonTest.java
    lib
        juint-4.9.jar
    build
        classes
           com.wind.domain
                Person.class
    lib
        AntProject.jar
    build.xml

2.build.xml配置文件说明

根元素project

<project name="AntProject" default="all" basedir="." ></project>
    name属性:为工程提供一个名字,
        作用:a.识别日志输出
              b.对于IDE工具而言,相当于文件的一个标识符
                
    default属性:构建文件build.xml中的一个目标名称
        属性值:clean prepare compile jar all
        作用:使得整个工程项目都可以按照指定的目标进行,一般建议要定义default属性,使用默认编译所有内容或者是使用构建文件的帮助
        
    basedir属性:定义工程根目录,一般为此构建文件的所在目录,即“.”
        作用:在层次工程的结构中,构建文件需要根据basedir来定义相应的不同参考点 

目标target

<target name= "compile" depends= "prepare" description="compile all source">
         <javac srcdir= "${src.dir}" destdir="${build.classes}" includeantruntime="on">
             <classpath refid="build.classpath"></classpath>
          </javac>
</target>

以上的目标是执行编译,告诉Ant要编译源文件信息

  1. Ant编译普通Java项目

创建build的文件目录

  1. 在该目录下创建src目录,存放java源代码
  2. 在该目录下创建classes目录,存放java编译后的字节码文件
  3. 在该目录下创建dist目录,存放jar包
<!-- create file-->
    <target name="createFile">
        <!-- first step must be delete dir -->
        <delete dir="build"/>
        <mkdir dir="build/src"/>
        <mkdir dir="build/classes"/>
        <mkdir dir="build/dist"/>    
    </target>

拷贝源码文件

<!-- copy src to build src -->
     <target name="copyFile" depends="createFile">
        <!-- first step must be delete dir -->
       <copy todir="build/src">
            <fileset refid="src.path"></fileset>
       </copy>
    </target>
    depends表示该任务依赖于createFile,即执行该任务前必须先执行createFile任务,refid引用了文件集的id,其中定义文件集的如下:
    <fileset id="src.path" dir="src">
        <!-- include the files -->
        <include name="**/**"/>
        <!-- exclude the files -->
        <exculde name="**/*Test.*"/>
    </fileset>

编译源代码并将其拷贝到classes目录下

 <target name="compile" depends="createFile">
        <javac srcdir="build/src" destdir="build/classes" includeantruntime="on" excludes="**/*Test.java">
            
        </javac>
    </target>
    编译源代码,srcdir指明源文件的路径,destdir指明要目标文件路径,即将编译好的class文件存放到该路径下excludes指明不编译哪些类型的源文件,includeanttime表示要使用ant的运行环境,如果要使用jdk的运行环境,则需要进行如下配置:
    <target name="compile" depends="createFile">
        <javac srcdir="build/src" destdir="build/classes" includeantruntime="no" fork="true" excludes="**/*Test.java">
            
        </javac>
    </target>

将项目打包为jar

<!-- package project to jar -->
    <target name="jar" depends="compile">
        <jar destfile="build/dist/Anproject.jar" basedir="build/classes">
            <manifest>
                <attribute name="Main-Class" value="com.wind.domain.Main"/>
                <attribute name="Build-By" value="keithl"/>
            </manifest>
        </jar>
    </target>
    将项目打包,首先要依赖于编译任务的完成,其次在该打包的任务下指明事件destfile表示要将该项目打成jar并给jar自定义名称,其次basedir表示需要打包的目标class文件,最后是红色框中的配置是可选的(<manifest>中的xml配置信息),如果要求该jar是可运行的,则需要添加上一个核心配置,即:
    
    <!-- if add like this,then say that jar is avaiabled run -->
    <attribute name="Main-Class" value="com.wind.domain.Main"/> 
    此时在生成的JAR文件下的META-INF下的MAINFEST.MF下增加如下的信息:
    Main-Class:com.wind.domain.Main
    Build-By:keithl

运行项目

执行项目有两种方式:
    一个是根据类路径来运行,arg是main函数的参数传递
    一个是基于JAR来运行,arg是main函数的参数传递
    <!-- not only execute the project,but also copy the source from the src -->
    <target name="execute" depends="jar,copyFile">
        <echo>基于类路径的classpath来完成</echo>
        <java classpath="build/classess" classname="com.wind.domain.Main">
            <arg value="arg parameter 1"/>
            <arg value="arg parameter 2"/>
            <arg value="arg parameter 3"/>
        </java>
        <echo>基于JAR来完成</echo>
        <java jar="build/dist/AntProject.jar" fork="true">
            <arg value="arg parameter 1"/>
            <arg value="arg parameter 2"/>
            <arg value="arg parameter 3"/>
        </java>
    </target>

构建Web的Ant模板

<project default= "deploy">
     
     <property name="src.dir" location="src"></property>
     
     <property name="build.dir" location="build"></property>
     <property name="build.classes" location="${build.dir}/classes"></property>
     <property name="build.war" location="${build.dir}/war"></property>
     
     <property name="web.name" value="AntWebProject"></property>
     <property name="web.root" value="WebContent"></property>
     <property name="web.WEB-INF" value="${web.root}/WEB-INF"></property>
     <property name="web.lib" value="${web.WEB-INF}/lib"></property>
     
     <property environment="env"></property>
     
     <target name="deploy" depends="clean,init,compile,war">
           <copy todir="${env.CATALINA_HOME}/webapps">
               <fileset dir= "${build.war}" includes="*.war"></fileset>
           </copy>
     </target>
     
     <target name="clean" >
           <delete dir= "${build.dir}"/>
     </target>
     
     <target name="init" >
           <mkdir dir= "${build.dir}"/>
           <mkdir dir= "${build.classes}"/>
           <mkdir dir= "${build.war}"/>
     </target>
     
     <path id="compile_path" >
           <fileset dir= "${web.lib}" includes="**/*.jar"></fileset>
           <fileset dir= "${env.CATALINA_HOME}/lib" includes="*.jar"></fileset>
     </path>
     
     <target name="compile" >
           <javac destdir= "${build.classes}" srcdir="${src.dir}" classpathref="compile_path" includeantruntime="on">
           </javac>
     </target>
     
     <target name="war" >
           <war destfile="${build.war}/${web.name}.war">
               <fileset dir= "${web.root}" includes="**/*.*"></fileset>
               <lib dir="${web.lib}"></lib>
               <webinf dir= "${web.WEB-INF}"></webinf>
               <classes dir= "${build.classes}"></classes>
           </war>
     </target>
</project>
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐