project-root/
├── src/ # 原始碼
├── lib/ # 第三方 JAR
├── classes/ # 編譯輸出
├── dist/ # JAR 輸出
├── war/ # WAR 輸出
├── doc/ # Javadoc 輸出
├── report/ # 測試報告
├── WebContent/ # Web 資源(含 WEB-INF/web.xml)
└── build.xml # Ant 腳本
build.xml 完整解析<property name="src.dir" value="src"/>
<property name="classes.dir" value="classes"/>
<property name="lib.dir" value="lib"/>
<property name="dist.dir" value="dist"/>
<property name="jar.name" value="hello.jar"/>
<property name="war.name" value="hello.war"/>
<property name="WebContent" value="WebContent"/>
<path id="master-classpath">
<fileset dir="${lib.dir}" includes="*.jar"/>
<pathelement path="${classes.dir}"/>
</path>
init<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="${classes.dir}"/>
<mkdir dir="${lib.dir}"/>
<mkdir dir="${dist.dir}"/>
<mkdir dir="${doc.dir}"/>
<mkdir dir="${war.dir}"/>
<echo message="初始化完成!"/>
</target>
compile<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>
includeantruntime="on" 將 Ant 自身類庫加入編譯類路徑,避免找不到系統類。
pack<target name="pack" depends="compile" description="make jar file">
<jar destfile="${dist.dir}/${jar.name}" basedir="${classes.dir}"/>
</target>
自動包含 classes.dir 下所有 .class 及資源檔,生成 META-INF/MANIFEST.MF。
war<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>
fileset:JSP、HTML、CSS、JS 等靜態資源lib:WEB-INF/lib 下的 JARclasses:編譯好的類別doc<target name="doc" depends="war" description="create api doc">
<javadoc destdir="${doc.dir}" author="true" version="true" use="true"
windowtitle="Hello World 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>
init → compile → pack → war → doc
命令列執行:
ant doc # 完整構建含文檔
ant pack # 僅打 JAR
ant war # 打 WAR(含 JAR)
| 問題 | 解決方案 |
|---|---|
| 編碼亂碼 | <javac encoding="UTF-8"/> |
| 增量編譯慢 | 使用 <depend> 任務或遷移 Gradle/Maven |
| Manifest 自定義 | <manifest><attribute name="Main-Class" value="com.Main"/></manifest> |
| 排除測試代碼 | <exclude name="**/*Test.java"/> |
Ant 適合簡單、舊專案維護。新專案建議採用 Maven(約定優於配置、依賴管理)或 Gradle(DSL 靈活、增量構建快),兩者均支援 Ant 任務互操作。