Ubuntu 22.04 安装 Apache AntUnit 指南
在 Ubuntu 22.04 从零搭建 Apache AntUnit 1.5.0 单元测试环境:JDK 17 与 Ant 1.10.18 完整安装、sha512 校验、antlib 两种注册方式、apt 备选方案与最小测试验收,全程实测。
Ubuntu 22.04 安装 Apache AntUnit 指南
目标:在 Ubuntu 22.04 服务器上从零安装 Apache AntUnit 1.5.0(基于 Apache Ant 1.10.18 的单元测试 antlib),覆盖 JDK 安装、官方发行包下载校验、antlib 两种注册方式、apt 备选方案与最小测试验收,已在 Ubuntu 22.04.5 LTS(OpenJDK 17.0.20.1、Ant 1.10.18)实测通过。
一、环境信息
本篇所有命令与回显均在以下环境中实测采集,复现时请保持相近版本:
- 操作系统:Ubuntu 22.04.5 LTS(jammy),x86_64
- JDK:OpenJDK 17.0.20.1(
openjdk-17-jdk-headless,Ubuntu 系统仓库) - 构建工具:Apache Ant 1.10.18(官方 dlcdn 发行包,2026-10 实测当前最新)
- 组件版本:Apache AntUnit 1.5.0(官方 dlcdn 发行包,2026-10 实测当前最新;jar 64749 字节)
- 安装目录:
/opt/apache-ant-1.10.18(Ant 主目录)、/opt/apache-ant-antunit-1.5.0(AntUnit 解压目录) - 实验目录:
/opt/lab(验收测试文件) - 执行用户:root
二、前置条件
AntUnit 不是独立进程,而是一组挂在 Ant 上的 antlib 任务库,因此安装链路是「JDK → Ant → AntUnit jar 注册」。本节先确认系统与基础工具,再装 JDK。
2.1 确认系统版本
cat /etc/os-release | head -3
回显(实测):
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
2.2 更新软件源并安装基础工具
apt-get update && apt-get install -y wget curl
回显(实测节选):
All packages are up to date.
The following additional packages will be installed:
wget
Setting up wget (1.21.2-2ubuntu1) ...
wget --version | head -1
回显(实测):
GNU Wget 1.21.2 built on linux-gnu.
2.3 安装 JDK 17
Ant 1.10.x 需要 Java 8 及以上运行,Ubuntu 22.04 仓库的 OpenJDK 17 即可:
apt-get install -y openjdk-17-jdk-headless
回显(实测节选):
Setting up openjdk-17-jdk-headless:amd64 (17.0.20.1+1-1~22.04) ...
java -version
回显(实测):
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)
dpkg -l openjdk-17-jdk-headless | tail -1
回显(实测):
ii openjdk-17-jdk-headless:amd64 17.0.20.1+1-1~22.04 amd64 OpenJDK Development Kit (JDK) (headless)
java -version 正常输出版本号即 JDK 就绪。AntUnit 本身是纯 Java 库,无其他系统依赖。
三、版本选型说明
选型核心是「AntUnit 版本 + Ant 版本 + JDK 版本」三者匹配。先实测官方站点当前最新版本:
curl -s https://dlcdn.apache.org/ant/antlibs/antunit/binaries/ | grep -oE 'apache-ant-antunit-[0-9.]+-bin\.tar\.gz' | sort -uV | tail -3
回显(实测):
apache-ant-antunit-1.4-bin.tar.gz
apache-ant-antunit-1.4.1-bin.tar.gz
apache-ant-antunit-1.5.0-bin.tar.gz
curl -s https://dlcdn.apache.org/ant/binaries/ | grep -oE 'apache-ant-1\.10\.[0-9]+-bin\.tar\.gz' | sort -uV | tail -1
回显(实测):
apache-ant-1.10.18-bin.tar.gz
⚠️ 注意:AntUnit 的发行路径是
https://dlcdn.apache.org/ant/antlibs/antunit/binaries/(antlibs 子目录下),直接访问https://dlcdn.apache.org/ant/antunit/会得到 404 Not Found——这是实测踩过的第一个坑。
| 组件 | 实测最新版本 | 要求/兼容 | 获取渠道 | 说明 |
|---|---|---|---|---|
| Apache AntUnit | 1.5.0(2026-06 发布) | Ant 1.8.1+ 运行;classpath 嵌套特性需 Ant 1.10.13+ | dlcdn.apache.org/ant/antlibs/antunit/binaries/ | 本文采用,sha512 校验通过 |
| Apache AntUnit | 1.4.1 | Ant 1.8.1+ | archive.apache.org / Maven 中央仓库 | 存量工程常见;Maven 坐标 org.apache.ant:ant-antunit:1.4.1(中央仓库目前最新仍是 1.4.1,1.5.0 仅发行官方包) |
| Apache Ant | 1.10.18 | Java 8+ | dlcdn.apache.org/ant/binaries/ | 本文采用,与 AntUnit 1.5.0 组合实测通过 |
| JDK | OpenJDK 17.0.20.1 | Java 8+ | Ubuntu 22.04 系统仓库 | 运行 Ant 与 AntUnit 正常 |
关键差异与选型建议:新环境直接采用官方最新组合「Ant 1.10.18 + AntUnit 1.5.0」;需要从 Maven 依赖管理引入时只能用 1.4.1(中央仓库版本滞后于官方发行包);AntUnit 1.5.0 新增的 classpath/classpathrefid 属性要求 Ant 1.10.13 以上,方案 B(apt 装 ant 1.10.12)会受此影响,见第五章说明。
四、安装方案 A:官方 tar.gz 安装(推荐)
方案 A 从官方站点下载 Ant 与 AntUnit 发行包,手动解压部署到 /opt,版本最新、可控且支持离线归档重放。AntUnit 1.5.0 只有一个 jar(64749 字节),注册就是把 jar 放进 Ant 的 lib 目录。
4.1 下载 Ant 1.10.18 并校验 sha512
cd /opt && wget https://dlcdn.apache.org/ant/binaries/apache-ant-1.10.18-bin.tar.gz && wget https://dlcdn.apache.org/ant/binaries/apache-ant-1.10.18-bin.tar.gz.sha512
回显(实测节选):
apache-ant-1.10.18-bin.tar.gz 100%[===================>] 6.80M 12.3MB/s in 0.6s
apache-ant-1.10.18-bin.tar.gz.s 100%[===================>] 129 --.-KB/s in 0s
cd /opt && printf '%s %s\n' "$(cat apache-ant-1.10.18-bin.tar.gz.sha512)" apache-ant-1.10.18-bin.tar.gz | sha512sum -c -
回显(实测):
apache-ant-1.10.18-bin.tar.gz: OK
校验输出 OK 说明下载完整(官方 sha512 值为 c510d744876d8da48dabc9495b023b6ec5284a0f18b40ee50d98ce099e791ca5c73e3cd4c80d3c90d3efc03f9620be43aad0a373ed47198284f7e3373e0db2c3,包大小 7133405 字节)。
4.2 解压 Ant 并安装 AntUnit 1.5.0
cd /opt && tar xzf apache-ant-1.10.18-bin.tar.gz && ls -d /opt/apache-ant-1.10.18
回显(实测):
/opt/apache-ant-1.10.18
下载 AntUnit 发行包并校验解压:
cd /opt && wget https://dlcdn.apache.org/ant/antlibs/antunit/binaries/apache-ant-antunit-1.5.0-bin.tar.gz && wget https://dlcdn.apache.org/ant/antlibs/antunit/binaries/apache-ant-antunit-1.5.0-bin.tar.gz.sha512 && printf '%s %s\n' "$(cat apache-ant-antunit-1.5.0-bin.tar.gz.sha512)" apache-ant-antunit-1.5.0-bin.tar.gz | sha512sum -c - && tar xzf apache-ant-antunit-1.5.0-bin.tar.gz
回显(实测):
apache-ant-antunit-1.5.0-bin.tar.gz: OK
ls -l /opt/apache-ant-antunit-1.5.0/ | head -12
回显(实测):
total 356
-rw-r--r-- 1 root root 1306 Jun 18 2026 CONTRIBUTORS
-rw-r--r-- 1 root root 3577 Jun 18 2026 LICENSE
-rw-r--r-- 1 root root 166 Jun 18 2026 NOTICE
-rw-r--r-- 1 root root 2317 Jun 18 2026 README
-rw-r--r-- 1 root root 9255 Jun 18 2026 README.html
-rw-r--r-- 1 root root 5827 Jun 18 2026 WHATSNEW
-rw-r--r-- 1 root root 7379 Jun 18 2026 ant-antunit-1.5.0-cyclonedx.json
-rw-r--r-- 1 root root 6596 Jun 18 2026 ant-antunit-1.5.0-cyclonedx.xml
-rw-r--r-- 1 root root 64749 Jun 18 2026 ant-antunit-1.5.0.jar
-rw-r--r-- 1 root root 161 Jun 18 2026 ant-antunit-1.5.0.jar.sha512
-rw-r--r-- 1 root root 1722 Jun 18 2026 ant-antunit-1.5.0.pom
-rw-r--r-- 1 root root 5009 Jun 18 2026 changes.xml
AntUnit 发行包结构说明:核心只有一个 ant-antunit-1.5.0.jar(64749 字节,纯 Java 8 字节码,无第三方依赖);docs/ 下是 antunit 任务、各断言任务与监听器的官方手册;etc/ 下是配 junitreport 生成 HTML 报告用的两个 XSL 样式表(junit-frames.xsl、junit-noframes.xsl);javadoc/ 是 API 文档。
4.3 配置环境变量
写入 /etc/profile.d/ant.sh,所有登录会话生效:
printf 'export ANT_HOME=/opt/apache-ant-1.10.18\nexport PATH=$ANT_HOME/bin:$PATH\n' > /etc/profile.d/ant.sh && source /etc/profile.d/ant.sh
回显(实测,无输出):
配置项说明:ANT_HOME 指向 Ant 主目录,Ant 启动脚本据此定位 lib 目录;PATH 前置 $ANT_HOME/bin 保证 ant 命令优先命中 1.10.18 而非系统仓库里的旧版本。
验证环境变量已生效:
echo $ANT_HOME && which ant
回显(实测):
/opt/apache-ant-1.10.18
/opt/apache-ant-1.10.18/bin/ant
4.4 注册 AntUnit antlib(方式一:jar 放入 Ant lib 目录)
Ant 通过命名空间 antlib:org.apache.ant.antunit 自动加载 jar 内的 antlib 描述符。Ant 官方发行版启动脚本会扫描 $ANT_HOME/lib/*.jar,把 AntUnit jar 拷进去即完成注册:
cp /opt/apache-ant-antunit-1.5.0/ant-antunit-1.5.0.jar /opt/apache-ant-1.10.18/lib/
回显(实测,无输出):
ls -l /opt/apache-ant-1.10.18/lib/ant-antunit-1.5.0.jar
回显(实测):
-rw-r--r-- 1 root root 64749 Oct 13 08:54 /opt/apache-ant-1.10.18/lib/ant-antunit-1.5.0.jar
4.5 验证安装
ant -version
回显(实测):
Apache Ant(TM) version 1.10.18 compiled on September 3 2026
再确认 AntUnit jar 已被 Ant 类路径加载(诊断输出中应能看到它):
ant -diagnostics | grep ant-antunit
回显(实测):
ant-antunit-1.5.0.jar (64749 bytes)
ant -version 输出 1.10.18 且诊断列表中出现 ant-antunit-1.5.0.jar,方案 A 安装完成。
五、安装方案 B:系统仓库 apt 安装(备选)
方案 B 直接用 apt 装 Ant,安装快、随系统升级,但版本滞后(Ubuntu 22.04 仓库当前为 1.10.12)。AntUnit 官方仓库没有 deb 包,jar 仍需手动下载注册。
5.1 安装 Ant
先查仓库版本:
apt-cache policy ant | head -3
回显(实测):
ant:
Installed: (none)
Candidate: 1.10.12-1
安装:
apt-get install -y ant
回显(实测节选):
Setting up ant (1.10.12-1) ...
Setting up ant-optional (1.10.12-1) ...
/usr/bin/ant -version
回显(实测):
Apache Ant(TM) version 1.10.12 compiled on January 17 1970
编译时间显示 January 17 1970 是 Debian 打包的构建时间戳规范(epoch 起点重置),不影响功能。Debian 版 Ant 的启动脚本同样扫描 /usr/share/ant/lib/,AntUnit jar 拷入即可注册:
cp /opt/apache-ant-antunit-1.5.0/ant-antunit-1.5.0.jar /usr/share/ant/lib/
回显(实测,无输出):
5.2 验证系统仓库方案的 AntUnit 可用性
mkdir -p /opt/lab && cd /opt/lab && cat > math-test.xml << 'EOF'
<project name="math-test" xmlns:au="antlib:org.apache.ant.antunit">
<property name="app.version" value="1.5.0"/>
<target name="test-version-equals">
<au:assertEquals expected="1.5.0" actual="${app.version}"/>
</target>
</project>
EOF
回显(实测,无输出):
/usr/bin/ant -version && ls /usr/share/ant/lib/ | grep antunit
回显(实测):
Apache Ant(TM) version 1.10.12 compiled on January 17 1970
ant-antunit-1.5.0.jar
用 /usr/bin/ant(1.10.12)运行上面的单用例测试:
cd /opt/lab && cat > build.xml << 'EOF'
<project name="antunit-runner" default="antunit" xmlns:au="antlib:org.apache.ant.antunit">
<target name="antunit">
<au:antunit>
<fileset dir="${basedir}" includes="math-test.xml"/>
<au:plainlistener/>
</au:antunit>
</target>
</project>
EOF
/usr/bin/ant -f build.xml
回显(实测):
Buildfile: /opt/lab/build.xml
antunit:
[au:antunit] Build File: /opt/lab/math-test.xml
[au:antunit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.014 sec
[au:antunit] Target: test-version-equals took 0.013 sec
BUILD SUCCESSFUL
Total time: 0 seconds
💡 说明:Debian/Ubuntu 打包的
ant使用上游启动脚本,会扫描/usr/share/ant/lib/*.jar,因此 jar 拷入即生效。CentOS/RHEL 系的 RPM 版 ant 启动脚本行为不同,注册方式见常见问题 8.2。
六、方案对比与选择建议
| 维度 | 方案 A:官方 tar.gz | 方案 B:apt 系统仓库 |
|---|---|---|
| Ant 版本 | 1.10.18(官方最新) | 1.10.12-1(仓库当前) |
| AntUnit 版本 | 1.5.0 | 1.5.0(jar 手动注册) |
| 是否联网下载 | 需访问 dlcdn.apache.org | 需访问 Ubuntu 镜像源 |
| 升级方式 | 手动下载新版替换目录 | apt 随仓库升级 |
| AntUnit 1.5.0 classpath 特性 | 可用(Ant ≥ 1.10.13) | 不可用(1.10.12 < 1.10.13) |
| 适合场景 | 生产 CI/测试基座,追求新版本 | 快速验证、对版本不敏感的内部环境 |
选择建议:测试基础设施建议选方案 A,版本新且 AntUnit 1.5.0 的全部特性可用;方案 B 胜在一条命令装好 Ant,但版本滞后一年以上,且 1.5.0 新增的 classpath/classpathrefid 属性(需 Ant 1.10.13+)在 1.10.12 上不可用。
七、安装验收:运行最小 AntUnit 测试
本节跑一个覆盖「断言文件存在 + 断言属性相等」的最小测试套件,作为安装完成的最终验收。AntUnit 的测试模型:测试 target 名以 test 开头,由 <au:antunit> 任务驱动执行,监听器汇总结果。
7.1 编写测试文件与运行器
cd /opt/lab && cat > math-test.xml << 'EOF'
<project name="math-test" xmlns:au="antlib:org.apache.ant.antunit">
<property name="app.version" value="1.5.0"/>
<target name="test-buildfile-exists">
<au:assertFileExists file="${ant.file}"/>
</target>
<target name="test-version-equals">
<au:assertEquals expected="1.5.0" actual="${app.version}" message="app.version should be 1.5.0"/>
</target>
</project>
EOF
回显(实测,无输出):
cd /opt/lab && cat > build.xml << 'EOF'
<project name="antunit-runner" default="antunit" xmlns:au="antlib:org.apache.ant.antunit">
<target name="antunit">
<au:antunit>
<fileset dir="${basedir}" includes="math-test.xml"/>
<au:plainlistener/>
</au:antunit>
</target>
</project>
EOF
回显(实测,无输出):
配置说明:math-test.xml 是测试文件本身,test-buildfile-exists 用 assertFileExists 断言构建文件存在(ant.file 是 Ant 内置属性,指向当前构建文件绝对路径),test-version-equals 用 assertEquals 断言属性 app.version 的值;build.xml 是运行器,<au:antunit> 用 <fileset> 选中测试文件、<au:plainlistener> 输出结果摘要。两个文件都需声明 xmlns:au="antlib:org.apache.ant.antunit" 命名空间。
7.2 运行验收
cd /opt/lab && ant -f build.xml
回显(实测):
Buildfile: /opt/lab/build.xml
antunit:
[au:antunit] Build File: /opt/lab/math-test.xml
[au:antunit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.017 sec
[au:antunit] Target: test-version-equals took 0.012 sec
[au:antunit] Target: test-buildfile-exists took 0.002 sec
BUILD SUCCESSFUL
Total time: 0 seconds
Tests run: 2, Failures: 0, Errors: 0 且 BUILD SUCCESSFUL,AntUnit 1.5.0 环境安装验收通过。
八、常见问题(FAQ)
8.1 运行 ant 报 “We cannot run Java”
现象(实测):
We cannot run Java, please ensure you have Java installed.
We have tried to execute java but failed.
If you have installed Java in a unusual place you can set JAVA_HOME
to the directory containing the Java installation.
原因与解决:java 不在 PATH 中(比如只装了 JDK 但环境变量没配置,或多 JDK 环境下 PATH 指向异常)。把 JDK 路径写入 profile:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
Ubuntu 下 openjdk-17-jdk-headless 默认通过 alternatives 把 /usr/bin/java 链好,一般不会遇到;若手动解压 JDK 安装则必须显式设置 JAVA_HOME。
8.2 构建文件报 “Could not load definitions from resource org/apache/ant/antunit/antlib.xml. It could not be found.”
现象:把 ant-antunit-1.5.0.jar 拷进了 Ant 的 lib 目录,运行含 <au:antunit> 的构建仍报找不到 antlib 资源。
原因:Ant 启动脚本构建类路径的方式因发行方式而异。官方 tar.gz 版与 Debian/Ubuntu 版脚本会扫描 $ANT_HOME/lib/*.jar(Ubuntu 还扫描 /usr/share/ant/lib),jar 拷入即生效;而 RHEL/CentOS 的 RPM 版脚本用 build-classpath 拼固定清单(实测仅 /usr/share/java/ant.jar:/usr/share/java/ant-launcher.jar),不扫描 lib 目录、不响应 -lib 参数。Ubuntu 下若确认 jar 已在 /usr/share/ant/lib 仍报错,可改用下面任一显式注册方式。
解决一:环境变量 CLASSPATH(apt 版 ant 脚本会将其并入启动类路径,实测有效):
export CLASSPATH=/usr/share/ant/lib/ant-antunit-1.5.0.jar
解决二:构建文件内用 taskdef 显式指定 jar 路径(任何发行方式都有效):
<project name="antunit-runner-cp" default="antunit" xmlns:au="antlib:org.apache.ant.antunit">
<taskdef uri="antlib:org.apache.ant.antunit"
resource="org/apache/ant/antunit/antlib.xml"
classpath="/usr/share/ant/lib/ant-antunit-1.5.0.jar"/>
<target name="antunit">
<au:antunit>
<fileset dir="${basedir}" includes="math-test.xml"/>
<au:plainlistener/>
</au:antunit>
</target>
</project>
8.3 访问 dlcdn.apache.org/ant/antunit/ 返回 404
AntUnit 属于 Ant 的 antlib(附属库)系列,发行目录是 ant/antlibs/antunit/ 而不是 ant/antunit/。正确的 binaries URL:
https://dlcdn.apache.org/ant/antlibs/antunit/binaries/apache-ant-antunit-1.5.0-bin.tar.gz
8.4 断言失败时构建以失败结束,想让构建继续跑完再统一处理
给 <au:antunit> 加 failOnError="false" 与 errorProperty:
<au:antunit failOnError="false" errorProperty="tests-failed">
<fileset dir="${basedir}" includes="math-test.xml"/>
<au:plainlistener/>
</au:antunit>
<fail if="tests-failed">At least one test has failed</fail>
failOnError 默认 true(任一用例失败立即中断构建);设为 false 后用例结果落到 errorProperty 指定的属性(如 tests-failed=true),可在同一构建内继续执行报告、清理等 target,最后自行决定是否失败。
九、卸载与清理
方案 A 的卸载(删除 Ant 主目录、AntUnit 目录与安装包):
rm -rf /opt/apache-ant-1.10.18 /opt/apache-ant-antunit-1.5.0
rm -f /opt/apache-ant-1.10.18-bin.tar.gz* /opt/apache-ant-antunit-1.5.0-bin.tar.gz*
rm -f /etc/profile.d/ant.sh
回显(实测,无输出):
方案 B 的卸载(apt 卸载 Ant 并清理 jar):
apt-get remove -y ant && rm -f /usr/share/ant/lib/ant-antunit-1.5.0.jar
回显(实测节选):
Removing ant (1.10.12-1) ...
验证清理干净:
which ant; echo "exit=$?"
回显(实测):
exit=1
which ant 无输出且退出码为 1,说明 ant 命令已不存在,卸载完成。
十、参考链接
- Apache AntUnit 官方主页:https://ant.apache.org/antlibs/antunit/
- AntUnit 官方手册(antunit 任务):https://ant.apache.org/antlibs/antunit/antunit.html
- 官方发行包(当前版本):https://dlcdn.apache.org/ant/antlibs/antunit/binaries/
- 历史版本归档:https://archive.apache.org/dist/ant/antlibs/antunit/binaries/
- Apache Ant 官方手册:https://ant.apache.org/manual/
- Maven 中央仓库坐标:https://repo1.maven.org/maven2/org/apache/ant/ant-antunit/