Ubuntu 22.04 安装 Apache Compress Ant Library 指南
在 Ubuntu 22.04 上从零安装 Apache Compress Ant Library 1.5,澄清 Maven Central 真实坐标 org.apache.ant:ant-compress,覆盖 Maven antrun 与官方 bin 包两种方案、ant -lib 与 ANT_HOME/lib 两种加载方式、gzip/bzip2/xz 往返校验、多版本管理与卸载,命令回显均实测通过。
Ubuntu 22.04 安装 Apache Compress Ant Library 指南
目标:在 Ubuntu 22.04 上从零搭建 Apache Compress Ant Library 1.5 的使用环境(JDK 17 + Ant + Maven),澄清它在 Maven Central 的真实坐标,并跑通 gzip/bzip2/xz 压缩解压的最小验证;本文全部命令与回显均已在 Ubuntu 22.04 实测通过。
Apache Compress Ant Library(官方名称 Apache Compress Antlib,jar 名 ant-compress)是 Apache Ant 项目下的 Antlib 扩展库,基于 Apache Commons Compress 为 Ant 构建脚本提供 <gzip>、<bzip2>、<xz>、<tar>、<zip>、<cpio>、<sevenz> 等增强任务。它不是独立进程,也没有常驻服务——「安装完成」的判定标准是:Ant 能按 antlib:org.apache.ant.compress 命名空间解析出这批任务,并成功跑通一个压缩往返脚本。本文给出两种落地方式:面向 Maven 工程的 antrun 插件集成方案,以及面向 Ant 命令行场景的官方 bin 包方案。
一、环境信息
本节先固定可复现的基线环境,后续所有命令均在此环境执行。
- 操作系统:Ubuntu 22.04.5 LTS(PRETTY_NAME="Ubuntu 22.04.5 LTS")
- 架构:x86_64
- JDK:OpenJDK 17.0.20.1(apt 包
openjdk-17-jdk) - 构建工具:Apache Ant 1.10.12(apt 包
ant)、Apache Maven 3.6.3(apt 包maven) - 组件版本:Apache Compress Antlib 1.5(依赖 Commons Compress 1.14、xz 1.6、Brotli dec 0.1.2)
- Maven 坐标:
org.apache.ant:ant-compress:1.5 - 官方下载目录:
https://downloads.apache.org/ant/antlibs/compress/binaries/ - 验证用工作目录:
/root/compress-demo(Maven 工程)、/root/compress-dl(bin 包下载与解压)
系统与架构确认(实时回显):
cat /etc/os-release | head -3
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
uname -m
x86_64
💡 说明:Compress Antlib 是构建工具插件而非服务,环境中不存在需要常驻的守护进程;验证标准是 Ant 构建脚本中
compress:前缀任务可解析、可执行,而不是某个端口处于监听状态。
二、前置条件
本节说明安装前必须满足的条件。Ubuntu 22.04 自带可用的软件源,联网即可通过 apt 获取 JDK、Ant 与 Maven。
- 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
- 可访问 Ubuntu 官方软件源(
apt update能正常拉取索引)。 - 可访问 Maven 中央仓库
repo1.maven.org与 Apache 官方下载站downloads.apache.org。 - 至少 2 GB 可用磁盘空间(JDK + Ant + Maven + 依赖 jar 合计约 600 MB)。
网络连通性确认(实时回显):
curl -sI --max-time 20 https://repo1.maven.org/maven2/org/apache/ant/ant-compress/ | head -1
HTTP/1.1 200 OK
curl -sI --max-time 20 https://downloads.apache.org/ant/antlibs/compress/binaries/ | head -1
HTTP/1.1 200 OK
三、版本选型说明
本节先澄清坐标,再给出版本谱系。一个高频误区必须先纠正:网上不少资料把这个库写成 org.apache.commons:commons-compress-antlib,该坐标在 Maven Central 并不存在(实测返回 404):
curl -s -o /dev/null -w "%{http_code}\n" --max-time 20 \
https://repo1.maven.org/maven2/org/apache/commons/commons-compress-antlib/maven-metadata.xml
404
真实坐标是 org.apache.ant:ant-compress(归属 Apache Ant 项目),其实测元数据如下:
curl -s --max-time 30 \
https://repo1.maven.org/maven2/org/apache/ant/ant-compress/maven-metadata.xml
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>org.apache.ant</groupId>
<artifactId>ant-compress</artifactId>
<versioning>
<latest>1.5</latest>
<release>1.5</release>
<versions>
<version>1.1</version>
<version>1.2</version>
<version>1.3</version>
<version>1.4</version>
<version>1.5</version>
</versions>
<lastUpdated>20170613080311</lastUpdated>
</versioning>
</metadata>
| 版本 | 发布时间(jar 时间戳实测) | Commons Compress 依赖 | 选型建议 |
|---|---|---|---|
| 1.1 – 1.3 | 2013 – 2014 | 1.4 – 1.8 | 历史遗留项目兼容 |
| 1.4 | 2016 | 1.7 / xz 1.4 | 老构建脚本兼容 |
| 1.5(当前最终版) | 2017-06-08 | 1.14 / xz 1.6 / brotli dec 0.1.2 | 本文采用 |
维护状态如实记录:1.5 的 jar 在 Maven Central 上的服务端时间戳为 2017-06-08(实测响应头 last-modified: Thu, 08 Jun 2017 11:36:52 GMT),此后近十年无新版本发布,官方也没有再排期——这是一个处于事实休眠(dormant)状态的项目。它仍然可用、稳定,前提是接受「不会修新 bug、不支持新格式」这一现实;如需持续演进的压缩能力,应直接使用其底层引擎 Apache Commons Compress(该库本身仍在活跃发版)。
选型结论:本文实际采用 1.5,理由是它是 Maven Central 上 latest 与 release 指向的最终版本,官方下载站 binaries 目录也只提供 1.5 的安装包,且对 JDK 17 + Ant 1.10.x 实测兼容。
💡 技术拓展:「Ant 任务封装」这条产品线上还有一个思路相反的选择——直接在 Ant 里用
<java>任务调用 Commons Compress 写的小工具类。对比:Antlib 方式零 Java 代码、声明式、内置增量判定(mode 属性)与权限保留,适合纯构建脚本;自写封装灵活、可升级 Commons Compress 版本,但要自己维护代码。本文采用 Antlib,理由是它就是为此场景而生,且与核心 Ant 任务(<zip>/<tar>)语义接近,学习成本低。
四、方案 A:Maven 依赖安装(在线,推荐)
本节面向 Maven 工程:通过 apt 安装 JDK 与 Maven,把 ant-compress 挂到 maven-antrun-plugin 的插件依赖里,在 pom 中直接使用 compress: 前缀任务。版本由 Maven 统一管控,是工程化程度最高的方式。
4.1 方案说明
方案 A 的链路是:apt 安装 openjdk-17-jdk、ant、maven → 在 pom.xml 的 maven-antrun-plugin <dependencies> 中声明 org.apache.ant:ant-compress:1.5 → Maven 自动下载 ant-compress 及其传递依赖(ant、commons-compress、xz、brotli dec)到本地仓库 → antrun 执行内嵌的 Ant 目标。优点是依赖版本进 pom、可复现;缺点是压缩逻辑被嵌在 Maven 生命周期里,脱离 Maven 无法直接复用。
4.2 安装 JDK 17、Ant 与 Maven
apt-get update -qq && apt-get install -y openjdk-17-jdk ant maven
# 输出节选(实测首尾)
Setting up openjdk-17-jdk:amd64 (17.0.20.1+1-1~22.04) ...
Setting up ant (1.10.12-1) ...
Setting up maven (3.6.3-5) ...
确认三者版本:
java -version 2>&1 | head -1
ant -version
mvn -version | head -3
openjdk version "17.0.20.1" 2026-08-18
Apache Ant(TM) version 1.10.12 compiled on January 17 1970
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.20.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64
验证点:ant -version 输出 1.10.x、mvn -version 的 Java version 一行显示 17.0.x 即就绪。Ubuntu 的 Maven 通过 PATH 中的 java 定位 JDK,无需设置 JAVA_HOME。
4.3 创建工程并编写 pom.xml
mkdir -p /root/compress-demo && cd /root/compress-demo
/root/compress-demo/pom.xml(完整内容,直接照抄):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>demo</groupId>
<artifactId>compress-antlib-demo</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-compress</artifactId>
<version>1.5</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>compress-logs</id>
<phase>generate-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target name="archive-logs" xmlns:compress="antlib:org.apache.ant.compress">
<mkdir dir="${project.basedir}/work"/>
<echo file="${project.basedir}/work/app.log">2026-10-15 10:00:00 INFO service started${line.separator}2026-10-15 10:05:00 INFO health check ok</echo>
<compress:gzip src="${project.basedir}/work/app.log" destfile="${project.basedir}/work/app.log.gz"/>
<compress:bzip2 src="${project.basedir}/work/app.log" destfile="${project.basedir}/work/app.log.bz2"/>
<compress:gunzip src="${project.basedir}/work/app.log.gz" dest="${project.basedir}/work/app-restored.log"/>
<checksum file="${project.basedir}/work/app.log" property="orig.md5"/>
<checksum file="${project.basedir}/work/app-restored.log" property="restored.md5"/>
<echo>orig=${orig.md5}</echo>
<echo>restored=${restored.md5}</echo>
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
逐项说明关键配置:
maven-antrun-plugin 3.1.0:在 Maven 生命周期里执行 Ant 任务的官方插件;ant-compress 声明在插件的<dependencies>里(不是工程<dependencies>),这样 jar 会进入插件执行 Ant 时的类路径。xmlns:compress="antlib:org.apache.ant.compress":写在<target>上,Ant 见到compress:前缀时按该 URI 在类路径中查找org/apache/ant/compress/antlib.xml自动装载全部任务。<compress:gzip src=... destfile=...>:压缩任务;<compress:gunzip src=... dest=...>为对应解压任务。- 两个
<checksum>计算压缩前与解压后的 MD5,用<echo>打印比对。
4.4 执行与验证
cd /root/compress-demo && mvn -B antrun:run@compress-logs
[INFO] --- maven-antrun-plugin:3.1.0:run (compress-logs) @ compress-antlib-demo ---
[INFO] Executing tasks
[INFO] [compress:gzip] Building: app.log.gz
[INFO] [compress:bzip2] Building: app.log.bz2
[INFO] [compress:gunzip] Expanding /root/compress-demo/work/app.log.gz to /root/compress-demo/work/app-restored.log
[WARNING] [echo] orig=2d9aea616572147c20ac38a68841cfd0
[WARNING] [echo] restored=2d9aea616572147c20ac38a68841cfd0
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.828 s
[INFO] Finished at: 2026-10-15T06:37:53Z
[INFO] ------------------------------------------------------------------------
ls -l /root/compress-demo/work/
total 16
-rw-r--r-- 1 root root 81 Oct 15 06:37 app-restored.log
-rw-r--r-- 1 root root 81 Oct 15 06:37 app.log
-rw-r--r-- 1 root root 99 Oct 15 06:37 app.log.bz2
-rw-r--r-- 1 root root 79 Oct 15 06:37 app.log.gz
结果解读:orig 与 restored 两个 MD5 完全一致(2d9aea616572147c20ac38a68841cfd0),说明 gzip 压缩后解压内容无损;三个产物均落盘。echo 显示为 [WARNING] 前缀是 antrun 3.x 的已知输出风格,非错误。
Maven 自动解析的传递依赖可在本地仓库确认(实时回显):
ls ~/.m2/repository/org/apache/ant/ant-compress/1.5/ | grep jar
ls -d ~/.m2/repository/org/apache/commons/commons-compress/1.14 \
~/.m2/repository/org/tukaani/xz/1.6 ~/.m2/repository/org/brotli/dec/0.1.2
ant-compress-1.5.jar
ant-compress-1.5.pom
/root/.m2/repository/org/apache/commons/commons-compress/1.14
/root/.m2/repository/org/tukaani/xz/1.6
/root/.m2/repository/org/brotli/dec/0.1.2
⚠️ 注意:ant-compress 的 pom 对 ant 的依赖声明为版本区间
[1.8.0,),Maven 会解析到仓库中最新的 1.10.x。若你的工程对 Ant 版本有严格要求,在插件<dependencies>中显式追加org.apache.ant:ant固定版本,Maven 即以显式声明优先。
五、方案 B:官方 bin 包安装(离线友好)
本节面向 Ant 命令行场景:下载 Apache 官方签名的二进制包,校验后把 jar 交给 Ant 加载。提供两种粒度——按次加载(-lib)与常驻安装(拷入 ANT_HOME/lib)。
5.1 方案说明
链路是:从 downloads.apache.org 下载 apache-ant-compress-1.5-bin-withdeps.tar.gz(自带全部依赖 jar)→ 校验 sha512 → 解压 → 用 ant -lib <目录> 按次加载,或把 jar 拷入 /usr/share/ant/lib 常驻。适用于无 Maven 的服务器、CI 镜像或离线环境。
5.2 下载与完整性校验
mkdir -p /root/compress-dl && cd /root/compress-dl
curl -sO --max-time 120 https://downloads.apache.org/ant/antlibs/compress/binaries/apache-ant-compress-1.5-bin-withdeps.tar.gz
curl -sO --max-time 30 https://downloads.apache.org/ant/antlibs/compress/binaries/apache-ant-compress-1.5-bin-withdeps.tar.gz.sha512
ls -l
total 1204
-rw-r--r-- 1 root root 1228538 Oct 15 06:33 apache-ant-compress-1.5-bin-withdeps.tar.gz
-rw-r--r-- 1 root root 129 Oct 15 06:33 apache-ant-compress-1.5-bin-withdeps.tar.gz.sha512
校验 sha512(期望值与实测值必须逐字一致):
echo "期望: $(cat apache-ant-compress-1.5-bin-withdeps.tar.gz.sha512)"
echo "实测: $(sha512sum apache-ant-compress-1.5-bin-withdeps.tar.gz | awk '{print $1}')"
期望: 7a8912300288d6bc64acbef46711cd097c3032d492b944dcec853b2d1b782da97cb5506981945acd74141a88387ee6b58d01111c50e2420dced95c6684c14c8d
实测: 7a8912300288d6bc64acbef46711cd097c3032d492b944dcec853b2d1b782da97cb5506981945acd74141a88387ee6b58d01111c50e2420dced95c6684c14c8d
⚠️ 注意:若 sha512 不一致,说明下载包损坏或被篡改,须删除后重新下载;切勿跳过校验直接使用。
5.3 解压与包内容
tar xzf apache-ant-compress-1.5-bin-withdeps.tar.gz && ls apache-ant-compress-1.5/
ant-compress-1.5.jar
ant-compress-1.5.jar.md5
ant-compress-1.5.jar.sha1
ant-compress-1.5.jar.sha512
ant-compress-1.5.pom
changes.xml
commons-compress-1.14.jar
CONTRIBUTORS
dec-0.1.2.jar
docs
javadoc
junit-4.11.jar
hamcrest-core-1.3.jar
LICENSE
NOTICE
README.html
WHATSNEW
xz-1.6.jar
参与构建运行的 4 个 jar(junit/hamcrest 是测试依赖,无需拷贝):
| jar | 作用 |
|---|---|
| ant-compress-1.5.jar | 任务与类型本体(164105 字节,实测) |
| commons-compress-1.14.jar | 底层压缩引擎 |
| xz-1.6.jar | <xz>/<lzma> 任务的格式实现 |
| dec-0.1.2.jar | <unbrotli> 任务的 Brotli 解码实现 |
包内 docs/ 目录是离线手册(pack.html/unpack.html/archive.html 等),javadoc/ 是 API 文档,断网时可直接查阅。
5.4 方式一:ant -lib 按次加载(不改动系统)
先用最小构建脚本验证。/root/compress-min-build.xml(完整内容):
<?xml version="1.0" encoding="UTF-8"?>
<project name="compress-min" default="all" basedir="." xmlns:compress="antlib:org.apache.ant.compress">
<target name="all">
<mkdir dir="work"/>
<echo file="work/app.log">2026-10-15 10:00:00 INFO service started${line.separator}2026-10-15 10:05:00 INFO health check ok</echo>
<compress:gzip src="work/app.log" destfile="work/app.log.gz"/>
<compress:gunzip src="work/app.log.gz" dest="work/app-restored.log"/>
<compress:bzip2 src="work/app.log" destfile="work/app.log.bz2"/>
<compress:bunzip2 src="work/app.log.bz2" dest="work/app-restored-bz2.log"/>
<compress:xz src="work/app.log" destfile="work/app.log.xz"/>
<compress:unxz src="work/app.log.xz" dest="work/app-restored-xz.log"/>
<checksum file="work/app.log" property="orig.md5"/>
<checksum file="work/app-restored.log" property="gzip.md5"/>
<checksum file="work/app-restored-bz2.log" property="bz2.md5"/>
<checksum file="work/app-restored-xz.log" property="xz.md5"/>
<echo>orig=${orig.md5} gzip=${gzip.md5} bz2=${bz2.md5} xz=${xz.md5}</echo>
</target>
</project>
脚本覆盖 gzip/bzip2/xz 三种压缩与对应解压,共 6 个 Antlib 任务。执行:
cd /root && ant -lib /root/compress-dl/apache-ant-compress-1.5 -f compress-min-build.xml
all:
[mkdir] Created dir: /root/work
[compress:gzip] Building: app.log.gz
[compress:gunzip] Expanding /root/work/app.log.gz to /root/work/app-restored.log
[compress:bzip2] Building: app.log.bz2
[compress:bunzip2] Expanding /root/work/app.log.bz2 to /root/work/app-restored-bz2.log
[compress:xz] Building: app.log.xz
[compress:unxz] Expanding /root/work/app.log.xz to /root/work/app-restored-xz.log
[echo] orig=2d9aea616572147c20ac38a68841cfd0 gzip=2d9aea616572147c20ac38a68841cfd0 bz2=2d9aea616572147c20ac38a68841cfd0 xz=2d9aea616572147c20ac38a68841cfd0
BUILD SUCCESSFUL
Total time: 1 second
验证点:BUILD SUCCESSFUL 且四个 MD5 完全一致,三种格式压缩解压全部无损。
5.5 方式二:ANT_HOME/lib 常驻安装
把 4 个 jar 拷入 Ant 的 lib 目录后,任何构建脚本无需 -lib 即可直接使用(实时回显):
cp /root/compress-dl/apache-ant-compress-1.5/{ant-compress-1.5.jar,commons-compress-1.14.jar,xz-1.6.jar,dec-0.1.2.jar} /usr/share/ant/lib/
ls /usr/share/ant/lib/ | grep -E "compress|xz|dec"
ant-compress-1.5.jar
ant-xz.jar
commons-compress-1.14.jar
dec-0.1.2.jar
xz-1.6.jar
cd /root && rm -rf work && ant -f compress-min-build.xml 2>&1 | tail -4
[echo] orig=2d9aea616572147c20ac38a68841cfd0 gzip=2d9aea616572147c20ac38a68841cfd0 bz2=2d9aea616572147c20ac38a68841cfd0 xz=2d9aea616572147c20ac38a68841cfd0
BUILD SUCCESSFUL
Total time: 0 seconds
说明:列表里的 ant-xz.jar 是 Ant 自带的 XZ 流包装(与 Antlib 无关),dec-0.1.2.jar 即 Brotli 解码库。常驻安装后同样 BUILD SUCCESSFUL,说明自动装载生效。
5.6 与系统压缩工具的互操作校验
Antlib 产物必须能被系统工具识别,才算真正可用:
cd /root/work
file app.log.gz app.log.bz2 app.log.xz
app.log.gz: gzip compressed data, original size modulo 2^32 81
app.log.bz2: bzip2 compressed data, block size = 900k
app.log.xz: XZ compressed data, checksum CRC64
gzip -t app.log.gz && echo "gzip -t OK"
bzip2 -t app.log.bz2 && echo "bzip2 -t OK"
xz -t app.log.xz && echo "xz -t OK"
gzip -dc app.log.gz | md5sum
gzip -t OK
bzip2 -t OK
xz -t OK
2d9aea616572147c20ac38a68841cfd0 -
三种格式全部通过系统工具完整性校验,且解压内容 MD5 与原文件一致——产物是标准格式,可与任何 gzip/bzip2/xz 工具互换。
六、方案对比与选择建议
本节汇总两种方案的差异。两种方案使用的是同一份 ant-compress 1.5 代码,差别仅在获取与类路径装配方式。
| 维度 | 方案 A:Maven antrun | 方案 B:官方 bin 包 |
|---|---|---|
| 依赖获取 | Maven 自动下载 + 版本进 pom | 手工下载 tar.gz + sha512 校验 |
| 类路径装配 | 插件 <dependencies> 自动注入 | -lib 按次 / 拷入 ANT_HOME/lib 常驻 |
| 是否联网 | 首次构建需联网 | 仅下载时需要联网 |
| 适用构建体系 | Maven 工程 | 纯 Ant 脚本、CI 镜像、离线服务器 |
| 升级方式 | 改 pom 版本号 | 替换 jar 文件 |
| 任务可复用范围 | 仅 Maven 生命周期内 | 任何 Ant 构建 |
选型建议:项目主构建是 Maven,压缩需求发生在打包/部署阶段,选方案 A;构建脚本本身就是 Ant,或要在多台服务器上分发同一套脚本,选方案 B。两者不冲突——Maven 工程也可以在 CI 里改用方案 B 的常驻安装跑独立 Ant 脚本。
七、配置说明
本节说明 Compress Antlib 使用中真正需要「配置」的三个层面。它没有自己的配置文件,全部行为由构建脚本属性与类路径决定。
1. 命名空间声明:使用 Antlib 任务的前提是在 <project> 或 <target> 上声明 xmlns:compress="antlib:org.apache.ant.compress"。URI 的 org.apache.ant.compress 部分与 jar 内 org/apache/ant/compress/antlib.xml 的资源路径严格对应,写错一个字符都会得到「The name is undefined」错误(排障见第九章 Q1)。前缀名 compress 可自定义,如 xmlns:cmp=... 后用 <cmp:gzip>。
2. 类路径装配:Ant 按 antlib: URI 解析任务时,会在运行时类路径中查找 antlib.xml 资源,可行途径有三:命令行 -lib <目录>(按次,优先级最高、零侵入)、ANT_HOME/lib(Ubuntu 上为 /usr/share/ant/lib,常驻全局生效)、以及 <taskdef uri=... resource=... classpath=...> 显式声明(适合 jar 位置不在默认目录的场景)。方案 B 的两种方式分别对应前两条。
3. 代码级参数:压缩级别(<gzip level> 0–9,1.5 起支持)、zip/tar 文件名编码(encoding 属性,如 UTF-8/GBK)、重复条目策略(duplicate="fail|preserve|add")、空归档策略(whenempty="fail|skip")、增量模式(mode="create|update|...")等,均通过任务属性控制,无全局配置。各参数的完整实测行为见第 4 篇《常用 API 与任务详解》。
环境变量 ANT_OPTS 可按需传递 JVM 参数(如 -Dfile.encoding=UTF-8),POSIX locale 服务器上处理中文文件名时需要(实测验证见第 5 篇进阶实战)。
八、多版本管理
ant-compress 版本谱系短(1.1–1.5),多版本共存靠「隔离 jar 目录 + 按需 -lib」实现,不建议同时拷多版本进 ANT_HOME/lib(同名类会冲突)。
按版本分目录存放 jar(实时回显,1.4 的 jar 直接取自 Maven Central):
mkdir -p /root/antlib-versions/1.5 /root/antlib-versions/1.4
cp /root/compress-dl/apache-ant-compress-1.5/ant-compress-1.5.jar /root/antlib-versions/1.5/
curl -s -o /root/antlib-versions/1.4/ant-compress-1.4.jar \
https://repo1.maven.org/maven2/org/apache/ant/ant-compress/1.4/ant-compress-1.4.jar
ls -R /root/antlib-versions/
/root/antlib-versions/:
1.4
1.5
/root/antlib-versions/1.4:
ant-compress-1.4.jar
/root/antlib-versions/1.5:
ant-compress-1.5.jar
构建时用 -lib /root/antlib-versions/1.5 或 -lib /root/antlib-versions/1.4 切换。注意每个版本要求的依赖版本不同:1.5 需要 commons-compress 1.14,而 1.4 的 pom 声明 commons-compress 1.7——切换 antlib 版本时必须连依赖一起切换,否则可能出现运行期行为差异。
💡 技术拓展:jar 冲突排查口诀——
ant -diagnostics会打印「ANT_HOME/lib jar listing」,先确认 Ant 实际看到的 jar 列表,再对照脚本期望;出现NoSuchMethodError时优先怀疑同包多版本共存。
九、常见问题(FAQ)
Q1:构建报 failed to create task or type antlib:org.apache.ant.compress:gzip / Cause: The name is undefined 怎么办?
这是 Ant 没能在类路径中找到 org/apache/ant/compress/antlib.xml。三种解法任选其一:命令行加 -lib <jar 所在目录>;把 4 个 jar 拷入 /usr/share/ant/lib 常驻;或脚本内显式 <taskdef uri="antlib:org.apache.ant.compress" resource="org/apache/ant/compress/antlib.xml" classpath="/路径/ant-compress-1.5.jar:/路径/commons-compress-1.14.jar:..."/>。同时检查 jar 是否齐全:缺 commons-compress-1.14.jar 时 ant-compress 本体无法工作。
Q2:mvn 执行 antrun 时报 compress:gzip 无法解析?
ant-compress 必须声明在 maven-antrun-plugin 的 <dependencies> 里,而不是工程顶层 <dependencies>。插件依赖才会进入插件执行 Ant 的类路径;工程依赖只影响你的 Java 代码编译。
Q3:运行时报 ClassNotFoundException: java.util.jar.Pack200?
这是 <pack200>/<unpack200>/<pack200normalize> 任务在 JDK 17 上的已知限制:Pack200 API 已从 JDK 14 起移除,而 ant-compress 1.5 依赖它。实测确认 1.5 在 JDK 17 上执行 <pack200> 必然报错。解法:用 JDK 8–13 的独立 Ant 环境执行 pack200 相关目标;或放弃 pack200 格式(该格式本身已被 JDK 官方废弃)。其余 gzip/bzip2/xz/tar/zip 等任务不受影响。
Q4:<compress:ar> 报 Failed to write archive?
AR 格式的条目名上限 16 字符,超长即失败(实测底层异常为 java.io.IOException: filename too long, > 16 chars: ...)。解法:缩短文件名;或加 format="bsd" 用 BSD 扩展名格式写超长名——但要注意 BSD 格式 ar 的互读性差(GNU ar 无法识别,详见第 5 篇进阶实战第八章),生产脚本建议控制文件名长度走默认格式。
Q5:能不能只装一个 jar?
不能。ant-compress-1.5.jar 只是任务壳,压缩实现全部在 commons-compress-1.14.jar 中;用到 xz/lzma 任务还需 xz-1.6.jar,用到 unbrotli 还需 dec-0.1.2.jar。官方 -withdeps 包已替你配齐这 4 个 jar,直接使用即可。
十、卸载与清理
ant-compress 本身不产生系统级安装,卸载即移除 jar 与本地文件。
移除常驻 jar 与实验目录:
rm -f /usr/share/ant/lib/ant-compress-1.5.jar /usr/share/ant/lib/commons-compress-1.14.jar \
/usr/share/ant/lib/xz-1.6.jar /usr/share/ant/lib/dec-0.1.2.jar
rm -rf /root/compress-demo /root/compress-dl /root/compress-min-build.xml /root/work \
/root/antlib-versions
确认清理结果(实时回显):
ls /usr/share/ant/lib/ | grep -cE "ant-compress|commons-compress-1|dec-0.1|xz-1.6" || echo "已清空"
已清空
移除 Maven 本地仓库中的 ant-compress(影响所有工程,慎用):
rm -rf $HOME/.m2/repository/org/apache/ant/ant-compress
卸载 Ant 与 Maven(仅当不再需要)。先以 -s 预演确认将删除的包,无误后去掉 -s 真正执行:
apt-get -s purge -y ant maven openjdk-17-jdk | grep "^Purg"
Purg ant [1.10.12-1]
Purg maven [3.6.3-5]
Purg openjdk-17-jdk [17.0.20.1+1-1~22.04]
apt-get purge -y ant maven openjdk-17-jdk && apt-get autoremove -y
十一、参考链接
- Apache Compress Antlib 官方主页:https://ant.apache.org/antlibs/compress/
- 官方二进制下载目录:https://downloads.apache.org/ant/antlibs/compress/binaries/
- Maven 中央仓库真实坐标页:https://repo1.maven.org/maven2/org/apache/ant/ant-compress/
- Antlib 使用说明(Ant 手册 Antlib 章节):https://ant.apache.org/manual/antlib.html
- 底层引擎 Apache Commons Compress:https://commons.apache.org/proper/commons-compress/
- OpenJDK 17 安装包(Ubuntu 官方源):
apt-cache show openjdk-17-jdk