Ubuntu 22.04 安装 Apache AntUnit 指南

在 Ubuntu 22.04 从零搭建 Apache AntUnit 1.5.0 单元测试环境:JDK 17 与 Ant 1.10.18 完整安装、sha512 校验、antlib 两种注册方式、apt 备选方案与最小测试验收,全程实测。

Apache AntUnitAntUnit2026/10/13

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 AntUnit1.5.0(2026-06 发布)Ant 1.8.1+ 运行;classpath 嵌套特性需 Ant 1.10.13+dlcdn.apache.org/ant/antlibs/antunit/binaries/本文采用,sha512 校验通过
Apache AntUnit1.4.1Ant 1.8.1+archive.apache.org / Maven 中央仓库存量工程常见;Maven 坐标 org.apache.ant:ant-antunit:1.4.1(中央仓库目前最新仍是 1.4.1,1.5.0 仅发行官方包)
Apache Ant1.10.18Java 8+dlcdn.apache.org/ant/binaries/本文采用,与 AntUnit 1.5.0 组合实测通过
JDKOpenJDK 17.0.20.1Java 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.01.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 命令已不存在,卸载完成。

十、参考链接