<project name="MyProject" default="all" basedir=".">
<!-- 1. 屬性定義 -->
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="dist.dir" value="dist"/>
<property name="lib.dir" value="lib"/>
<!-- 2. 路徑結構 -->
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<!-- 3. 目標依賴鏈 -->
<target name="all" depends="clean,compile,jar"/>
<target name="clean">
<delete dir="${build.dir}"/>
<delete dir="${dist.dir}"/>
</target>
<target name="compile">
<mkdir dir="${build.dir}/classes"/>
<javac srcdir="${src.dir}" destdir="${build.dir}/classes"
classpathref="classpath"
includeantruntime="false"
source="1.8" target="1.8" encoding="UTF-8"/>
</target>
<target name="jar" depends="compile">
<mkdir dir="${dist.dir}"/>
<jar destfile="${dist.dir}/${ant.project.name}.jar" basedir="${build.dir}/classes">
<manifest>
<attribute name="Main-Class" value="com.example.Main"/>
<attribute name="Class-Path" value="lib/dependency.jar"/>
</manifest>
</jar>
</target>
<!-- 4. 可選:單元測試 -->
<target name="test" depends="compile">
<junit printsummary="yes" haltonfailure="true">
<classpath>
<path refid="classpath"/>
<pathelement location="${build.dir}/classes"/>
</classpath>
<formatter type="xml"/>
<batchtest fork="yes" todir="${build.dir}/test-results">
<fileset dir="${src.dir}" includes="**/*Test.java"/>
</batchtest>
</junit>
</target>
<!-- 5. 可選:資源複製 -->
<target name="copy-resources">
<copy todir="${build.dir}/classes">
<fileset dir="${src.dir}" excludes="**/*.java"/>
</copy>
</target>
<!-- 6. 可選:部署 (SSH/SCP/FTP) -->
<target name="deploy" depends="jar">
<scp file="${dist.dir}/${ant.project.name}.jar"
todir="user@host:/opt/app/"
keyfile="${user.home}/.ssh/id_rsa" trust="true"/>
</target>
</project>
| 任務 | 標籤 | 核心屬性/子元素 | 典型用途 |
|---|---|---|---|
| 屬性定義 | <property> | name, value, location, file, environment | 路徑、版本、環境變量注入 |
| 目錄創建 | <mkdir> | dir | 構建輸出目錄 |
| 目錄/文件刪除 | <delete> | dir, file, includes, excludes, failonerror | 清理構建產物 |
| 文件/目錄複製 | <copy> | file/todir, flatten, overwrite, filtering, fileset | 資源複製、配置文件變量替換 |
| Java 編譯 | <javac> | srcdir, destdir, classpath, source, target, encoding, includeantruntime, debug | 核心編譯任務 |
| JAR 打包 | <jar> | destfile, basedir, manifest, fileset, includes, excludes | 生成可執行/庫 JAR |
| WAR 打包 | <war> | destfile, webxml, lib, classes, fileset | Web 應用打包 |
| 單元測試 | <junit> | printsummary, haltonfailure, fork, classpath, formatter, batchtest | JUnit 3/4 測試運行 |
| SQL 執行 | <sql> | driver, url, userid, password, classpath, transaction, src, delimtype | DDL/DML 腳本執行、數據初始化 |
| SSH/SCP | <sshexec>/<scp> | host, username, password/keyfile, command, todir, trust | 遠程部署、命令執行 |
| 條件判斷 | <condition> | property, value, else, elseif, os, equals, contains | 跨平台構建邏輯 |
| 循環迭代 | <for> (ant-contrib) | list, param, trim | 批量處理多模塊/多環境 |
<property file="build.properties"/> 區分開發/測試/生產環境<path id="..."> + classpathref 避免重複encoding="UTF-8" 避免中文亂碼<manifest> 使用屬性注入版本號、構建時間、Git Commit ID建議:新項目直接上 Maven/Gradle;存量 Ant 項目可漸進式遷移 (Maven Ant Tasks / Gradle AntBuilder)。
Ant 給予完全控制權,但也要求極高自律。掌握核心任務標籤,能讓舊專案構建穩定可控;新專案請擁抱約定優於配置的現代構建工具。