Apache Ant 是經典的 Java 構建工具,通過 XML 定義構建流程。本文提供完整的 build.xml 腳本,涵蓋初始化清理、編譯、打包 JAR、打包 WAR、生成 Javadoc 等全生命週期任務,採用屬性化配置、路徑引用、任務依賴鏈等最佳實踐。
<?xml version="1.0" encoding="UTF-8"?>
<project name="Hello world" default="doc" basedir=".">
<!-- 屬性定義:集中管理路徑與文件名 -->
<property name="src.dir" value="src"/>
<property name="report.dir" value="report"/>
<property name="classes.dir" value="classes"/>
<property name="lib.dir" value="lib"/>
<property name="dist.dir" value="dist"/>
<property name="doc.dir" value="doc"/>
<property name="jar.name" value="hello.jar"/>
<property name="war.name" value="hello.war"/>
<property name="WebContent" value="WebContent"/>
<property name="war.dir" value="war"/>
<!-- 編譯類路徑定義 -->
<path id="master-classpath">
<fileset dir="${lib.dir}" includes="*.jar"/>
<pathelement path="${classes.dir}"/>
</path>
<!-- 1. 初始化:清理舊產物、創建目錄結構 -->
<target name="init">
<delete dir="${lib.dir}"/>
<delete dir="${dist.dir}"/>
<delete dir="${doc.dir}"/>
<delete dir="${war.dir}"/>
<mkdir dir="${src.dir}"/>
<mkdir dir="${report.dir}"/>
<mkdir dir="${classes.dir}"/>
<mkdir dir="${lib.dir}"/>
<mkdir dir="${dist.dir}"/>
<mkdir dir="${doc.dir}"/>
<mkdir dir="${war.dir}"/>
<echo message="初始化完成!"/>
</target>
<!-- 2. 編譯:依賴 init,引用 classpath -->
<target name="compile" depends="init" description="compile the source files">
<javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="on">
<classpath refid="master-classpath"/>
</javac>
</target>
<!-- 3. 打包 JAR:依賴 compile -->
<target name="pack" depends="compile" description="make jar file">
<jar destfile="${dist.dir}/${jar.name}" basedir="${classes.dir}"/>
</target>
<!-- 4. 打包 WAR:依賴 pack -->
<target name="war" depends="pack">
<war destfile="${war.dir}/${war.name}" webxml="${WebContent}/WEB-INF/web.xml">
<fileset dir="${WebContent}"/>
<lib dir="${WebContent}/WEB-INF/lib"/>
<classes dir="${classes.dir}"/>
</war>
</target>
<!-- 5. 生成 Javadoc:依賴 war (默認目標) -->
<target name="doc" depends="war" description="create api doc">
<javadoc destdir="${doc.dir}" author="true" version="true" use="true" windowtitle="HelloWorld API">
<packageset dir="${src.dir}" defaultexcludes="yes">
<include name="example/**"/>
</packageset>
<doctitle><![CDATA[<h1>Hello, World</h1>]]></doctitle>
<bottom><![CDATA[<i>All Rights Reserved</i>]]></bottom>
<tag name="todo" scope="all" description="Todo:"/>
</javadoc>
</target>
</project>
| Target | 依賴 | 功能 | 核心任務 |
|---|---|---|---|
| init | - | 環境準備 | delete、mkdir、echo |
| compile | init | 源碼編譯 | javac (classpath 引用) |
| pack | compile | 生成 JAR | jar (basedir=classes) |
| war | pack | 生成 WAR | war (webxml、fileset、lib、classes) |
| doc | war | 生成 API 文檔 | javadoc (packageset、doctitle、tag) |
srcdir:源碼根目錄destdir:輸出 .class 目錄includeantruntime:是否包含 Ant 自身類庫 (建議 false 避免污染)classpath:引用預定義 path iddestfile:輸出 JAR 路徑basedir:打包根目錄 (通常為 classes 目錄)manifest 指定 Main-Class 等屬性destfile:輸出 WAR 路徑webxml:web.xml 部署描述符路徑fileset:Web 靜態資源 (JSP、HTML、CSS、JS 等)lib:WEB-INF/lib 下的第三方 JARclasses:WEB-INF/classes 下的編譯類文件destdir:輸出目錄author/version/use:包含作者、版本、使用頁面windowtitle:瀏覽器標題欄文本packageset:指定包含的包 (支援通配符)doctitle/bottom:頁面頂部/底部 HTML 內容tag:自定義標籤 (如 @todo)depend 任務分析依賴junit target,依賴 compile,生成測試報告parallel 任務並發執行獨立 target新項目建議優先考慮 Maven (約定優於配置、依賴管理、生命週期標準化) 或 Gradle (DSL 靈活、增量構建、多項目構建)。Ant 適用於: