Ant

安装

  • 官网下载压缩包,解压
  • 设置环境变量
  • 默认在当前目录下寻找build.xml文件来进行构建和执行
  • ant -f helloworld.xml 可以带参数来指定要执行的文件
  • build.xml文件要放在项目的根目录下,和src并列
  • 自动处理路径中的正反斜杠的问题
  • Ant还包含了CVS版本控制的标签,没有添加,等找到git的在补全吧

实例

创建文件夹

    <?xml version="1.0" encoding="UTF-8"?>
    <project default="init" name="Project">  <!-- name属性可以省略 -->
        <target name="init">
            <mkdir dir="helloworld\a" />
            <mkdir dir="hello" />
        </target>
    </project>

删除目录,可以是非空目录

    <?xml version="1.0" encoding="UTF-8"?>
    <project default="init">  <!-- 必须有一个且仅有一个根元素project,每个生成文件由一个project元素组成 -->
        <target name="init">  <!-- 一个project可以包含多个target,一个target可以做一个或多个事情 -->
            <delete dir="helloworld" />
        </target>
    </project>

执行顺序 属性 修饰description

  • target的位置不重要,是靠depends属性来决定先后顺序的
    <?xml version="1.0" encoding="UTF-8"?>
    <project default="second">  <!-- 会根据这里的default去寻找对应的target -->
        <description>  <!-- 描述性内容,可以省略 -->
            hello world
        </description>
        <property name="hello" value="welcome" />
        <target name="init" description="helloworld">  <!-- description可以省略 -->
            <mkdir dir="helloworld\a" />
            <mkdir dir="hello" />
            <mkdir dir="${hello}" />  <!-- 这里用到了上面的定义的属性 -->
        </target>
        <target name="second" depends="init">  <!-- 执行这个以前会去先执行depends对应的targhet -->
            <mkdir dir="abc" />  <!-- 所以执行的顺序依然是init, second -->
            <mkdir dir="xyz" />
        </target>
    </project>
  • 如果用ant -f helloworld.xml second 就不会再去执行init了
  • ant init second 会按参数的顺序去执行,但second又是依赖于init的,所以init会显示执行了两次

执行顺序二

    <?xml version="1.0" encoding="UTF-8"?>
    <project default="package" basedir=".">  <!-- basedir指向的是根目录 -->
        <target name="init" />  <!-- 可以看到这里的init只执行了一次 -->
        <target name="preprocess" depends="init" />
        <target name="compile" depends="init,preprocess" />  <!-- 用逗号链接,不是空格 -->
        <target name="package" depends="compile" />
    </project>

综合

    <?xml version="1.0" encoding="UTF-8"?>
    <project default="package">
        <!-- 会根据这里的default去寻找对应的target -->
        <property name="compile" value="compile" />
        <property name="dist" value="dist" />
        <property name="src" value="src" />
        <target name="init" />
        <!-- 可以看到这里的init只执行了一次 -->
        <target name="preprocess" depends="init">
            <mkdir dir="${compile}" />
            <mkdir dir="${dist}" />
        </target>
        <target name="compile" depends="init,preprocess" />
        <!-- 用逗号链接,不是空格 -->
        <target name="package" depends="compile" />
        <target name="MyCompile" depends="preprocess">
            <javac srcdir="src" destdir="${compile}">
                <!-- 执行这个target的时候,会自动去编译srcdir目录下的所有文件 -->
            </javac>
            <!-- 生成class文件,destdir如果不设置默认就是当前文件 -->
        </target>
        <target name="dist" depends="MyCompile">
            <tstamp></tstamp>
            <!-- 这里先预定义一下tstamp,DSTAMP自动生成时间戳 -->
            <jar destfile="${dist}/package-${DSTAMP}.jar" basedir="${compile}">
                <!-- 基于basedir目录,也就是class文件来生成jar文件 -->
                <manifest>
                    <!-- 指定对清单文件设置哪些属性 -->
                    <attribute name="Built-By" value="${user.name}" />
                    <!-- user.name内置属性,表示当前的用户名 -->
                    <attribute name="Main-Class" value="com.shengsiyuan.image.google.Test" />
                </manifest>
                <!-- 靠Main-Class这个属性来实现双击运行,Build-By是解释性的 -->
            </jar>
        </target>
        <target name="deleteFile">
            <delete file="${dist}/packagexxx.jar"></delete>
            <!-- 这个是删除单个文件,不是文件夹 -->
            <delete dir="${dist}"></delete>
            <!-- 删除目录,可以是非空 -->
        </target>
        <target name="copyFile">
            <copy file="src/test.java" tofile="c:/test2.java"></copy>
            <!-- 复制并重命名 -->
            <copy file="src/test.java" todir="c:/"></copy>
        </target>
        <target name="moveFile">
            <move file="src/test.java" todir="c:/"></move>
            <!-- 移动文件,也可以使用tofile来重命名 -->
        </target>
        <target name="compress" depends="MyCompile">
            <zip destfile="${dist}" basedir="${compile}"></zip>
        </target>
        <target name="uncompress" depends="compress">
            <unzip dest="${dist}" src="${dist}/package.zip"></unzip>
        </target>
        <target name="replaceOperation">
            <replace file="input.txt" token="how" value="what" summary="on"></replace>
            <!-- token表示要被替换的字符串,summary属性会输出修改的数目 -->
        </target>
        <target name="copy2">
            <copy todir="${dist}">
                <fileset dir="src">
                    <!-- fileset默认包含src目录下的所有文件 -->
                    <include name="**/*.java" />
                </fileset>
            </copy>
            <!-- */*.java 表示匹配当前目录下的java文件,**/*.java 表示匹配所有目录下的java文件 -->
        </target>
        <taskdef name="myFileSorterExample" classname="com.shengsiyuan.ant.tools.extend.FileSorter" classpath="bin"></taskdef>
        <!-- classname中的类是自己编写的,继承自org.apache.tools.ant.Task,并重写execute(),具体请见圣思园Ant第4集视频 -->
        <!-- classpath放的是自己编译好的class文件的路径-->
        <target name="myFileSorter">
            <myFileSorterExample srcFile="input.txt" destFile="output.txt" />
        </target>
    </project>

你可能感兴趣的:(Ant)