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 往返校验、多版本管理与卸载,命令回显均实测通过。

Apache Compress Ant LibraryApache Compress Ant Library2026/10/15

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。

  1. 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
  2. 可访问 Ubuntu 官方软件源(apt update 能正常拉取索引)。
  3. 可访问 Maven 中央仓库 repo1.maven.org 与 Apache 官方下载站 downloads.apache.org。
  4. 至少 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.32013 – 20141.4 – 1.8历史遗留项目兼容
1.420161.7 / xz 1.4老构建脚本兼容
1.5(当前最终版)2017-06-081.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

十一、参考链接

  1. Apache Compress Antlib 官方主页:https://ant.apache.org/antlibs/compress/
  2. 官方二进制下载目录:https://downloads.apache.org/ant/antlibs/compress/binaries/
  3. Maven 中央仓库真实坐标页:https://repo1.maven.org/maven2/org/apache/ant/ant-compress/
  4. Antlib 使用说明(Ant 手册 Antlib 章节):https://ant.apache.org/manual/antlib.html
  5. 底层引擎 Apache Commons Compress:https://commons.apache.org/proper/commons-compress/
  6. OpenJDK 17 安装包(Ubuntu 官方源):apt-cache show openjdk-17-jdk