Ubuntu 22.04 安装 Apache Ivy 2.6.0 指南

在 Ubuntu 22.04 上安装 Apache Ivy 2.6.0,覆盖 JDK/Ant 前置、with-deps 包下载与 sha512 校验、接入 Ant lib、resolve/retrieve/report 首跑验证与独立 CLI 用法,含 10 个常见问题排障

Apache IvyIvyApacheJava安装部署Ubuntu 22.042026/10/14

Ubuntu 22.04 安装 Apache Ivy 2.6.0 指南

本文全部命令与回显均在 Ubuntu 22.04(jammy)容器(OpenJDK 17.0.20.1)中真实执行采集,未经润色。Ivy 是 Apache Ant 旗下的依赖管理工具,最新版 2.6.0(2026-07-15 上架 dlcdn,jar 内 build 号 20260712075753)。

一、Ivy 是什么、装哪个包

Ivy 解决的是 Ant 生态没有依赖管理的问题:项目在 ivy.xml 中声明依赖(支持 3.+ 这类动态版本),Ivy 负责从 Maven Central 等仓库解析、下载、缓存,并可通过 ivy:retrieve 把 jar 复制到项目 lib/ 目录。它有两种使用形态:

  • Ant 任务形态:把 ivy-2.6.0.jar 放入 $ANT_HOME/lib,在 build.xml 中用 xmlns:ivy="antlib:org.apache.ivy.ant" 声明命名空间后使用 ivy:resolve 等任务;
  • 独立 CLI 形态:直接 java -jar ivy-2.6.0.jar,不依赖 Ant 安装(本文第八章)。

发行包有四种:bin(仅 Ivy 本体)、bin-with-deps(含 Ant 任务运行所需全部依赖,约 8MB)、src 源码包,各有 .tar.gz 与 .zip 两种压缩格式。生产建议直接用 bin-with-deps,可避免 ivy:report 等任务缺依赖的问题(实测 with-deps 包 report 一次通过)。

二、环境与前置条件

项目要求本文实测环境
操作系统Linux 均可Ubuntu 22.04 (jammy)
JDKIvy 2.6.0 由 Java 11 构建,Java 8+ 可运行OpenJDK 17.0.20.1
Ant仅 Ant 任务形态需要Apache Ant 1.10.18
网络需访问 repo1.maven.org 解析依赖直连(约 60–700KB/s)

三、安装 JDK 与基础工具

apt-get update && apt-get install -y openjdk-17-jdk-headless curl wget unzip

apt 阶段真实回显(节选):

Get:12 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages [17.5 MB]
Fetched 49.0 MB in 1min 13s (667 kB/s)
Reading package lists...

验证:

java -version
javac -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)
javac 17.0.20.1

四、安装 Ant 1.10.18(Ant 任务形态前置)

cd /tmp && curl -fLO https://dlcdn.apache.org/ant/binaries/apache-ant-1.10.18-bin.tar.gz
tar -xzf apache-ant-1.10.18-bin.tar.gz -C /opt
ln -s /opt/apache-ant-1.10.18 /opt/ant
/opt/ant/bin/ant -version
Apache Ant(TM) version 1.10.18 compiled on September 3 2026

建议在 /etc/profile.d/ 中加入 export ANT_HOME=/opt/ant 与 export PATH=$ANT_HOME/bin:$PATH。

五、下载 Ivy 2.6.0 并做 sha512 校验

注意路径是 /ant/ivy/ 而不是 /ivy/(Ivy 隶属 Ant 项目,dlcdn 挂在 Ant 目录下,直接访问 dlcdn.apache.org/ivy/ 会 404):

cd /tmp
curl -fLO https://dlcdn.apache.org/ant/ivy/2.6.0/apache-ivy-2.6.0-bin-with-deps.tar.gz
curl -fLO https://dlcdn.apache.org/ant/ivy/2.6.0/apache-ivy-2.6.0-bin-with-deps.tar.gz.sha512

下载耗时回显(供网速预估):

100 8028k  100 8028k    0     0  76022      0  0:01:48  0:01:48 --:--:-- 62209

校验(官方 sha512 文件内容为纯小写十六进制摘要):

cat apache-ivy-2.6.0-bin-with-deps.tar.gz.sha512
sha512sum apache-ivy-2.6.0-bin-with-deps.tar.gz
ls -l apache-ivy-2.6.0-bin-with-deps.tar.gz | awk '{print $5}'
dbba3b8aa96255d06bf204c515eb7c5c91bf55c76015d0b704a84f12a035ba3fca50eb9d51a57203b83140a6c73d9d91b2c292d1213e0e721b7c1e8f8700aefb
dbba3b8aa96255d06bf204c515eb7c5c91bf55c76015d0b704a84f12a035ba3fca50eb9d51a57203b83140a6c73d9d91b2c292d1213e0e721b7c1e8f8700aefb  apache-ivy-2.6.0-bin-with-deps.tar.gz
8220866

两端一致、字节数 8,220,866,校验通过。若中途断链,用 curl -C - -fLO <同一URL> 续传。

六、解压并接入 Ant

tar -xzf apache-ivy-2.6.0-bin-with-deps.tar.gz -C /opt
cp /opt/apache-ivy-2.6.0/ivy-2.6.0.jar /opt/ant/lib/
ls -la /opt/ && ls -la /opt/ant/lib/ivy-2.6.0.jar
ant
apache-ant-1.10.18
apache-ivy-2.6.0
-rw-r--r-- 1 root root 1413973 Oct 14 15:07 /opt/ant/lib/ivy-2.6.0.jar

/opt/apache-ivy-2.6.0/ 内含 LICENSE NOTICE doc ivy-2.6.0.cdx.json ivy-2.6.0.cdx.xml ivy-2.6.0.jar ivy.xml ivy.xsd lib src。jar MANIFEST 佐证版本(unzip -p ivy-2.6.0.jar META-INF/MANIFEST.MF 节选):

Specification-Title: Apache Ivy with Ant tasks
Specification-Version: 2.6.0
Implementation-Version: 2.6.0
Build-Version: 2.6.0
Ant-Version: Apache Ant 1.10.18alpha
Created-By: 11.0.31+11-post-1ubuntu1-24.04.2-Ubuntu (Ubuntu)

接入 Ant 的原理:Ant 启动时会把 $ANT_HOME/lib/*.jar 全部载入类路径,xmlns:ivy="antlib:org.apache.ivy.ant" 即可自动发现 Ivy 的 antlib 定义,无需额外 taskdef。

七、首次验证:resolve / retrieve / compile / run / report

创建演示项目 /root/ivy-demo/,三个文件:

src/Hello.java

import org.apache.commons.lang3.StringUtils;

public class Hello {
    public static void main(String[] args) {
        String msg = StringUtils.capitalize("hello apache ivy");
        System.out.println(msg);
        System.out.println("reverse: " + StringUtils.reverse(msg));
        System.out.println("abbreviate: " + StringUtils.abbreviate("Apache Ivy is a powerful dependency manager", 24));
    }
}

ivy.xml(rev="3.+" 表示"最新 3.x"动态版本)

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0">
    <info organisation="com.example" module="ivy-demo" revision="1.0"/>
    <configurations>
        <conf name="default" visibility="public"/>
    </configurations>
    <dependencies>
        <dependency org="org.apache.commons" name="commons-lang3" rev="3.+" conf="default"/>
    </dependencies>
</ivy-module>

build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="ivy-demo" default="run" xmlns:ivy="antlib:org.apache.ivy.ant">

    <property name="src.dir" value="src"/>
    <property name="build.dir" value="build"/>
    <property name="lib.dir" value="lib"/>

    <target name="resolve" description="parse ivy.xml and download dependencies into the Ivy cache">
        <ivy:resolve/>
    </target>

    <target name="retrieve" depends="resolve" description="retrieve resolved dependencies into project lib dir">
        <ivy:retrieve pattern="lib/[artifact].[ext]"/>
    </target>

    <target name="compile" depends="retrieve" description="compile sources">
        <mkdir dir="${build.dir}/classes"/>
        <javac srcdir="${src.dir}" destdir="${build.dir}/classes" includeantruntime="false">
            <classpath>
                <fileset dir="${lib.dir}" includes="*.jar"/>
            </classpath>
        </javac>
    </target>

    <target name="run" depends="compile" description="run main class">
        <java classname="Hello" fork="true">
            <classpath>
                <pathelement path="${build.dir}/classes"/>
                <fileset dir="${lib.dir}" includes="*.jar"/>
            </classpath>
        </java>
    </target>

    <target name="report" depends="resolve" description="generate HTML dependency report">
        <ivy:report todir="report"/>
    </target>

</project>

7.1 ant resolve(首次联网下载)

cd /root/ivy-demo && ant resolve
Buildfile: /root/ivy-demo/build.xml

resolve:
[ivy:resolve] :: Apache Ivy 2.6.0 - 20260712075753 :: https://ant.apache.org/ivy/ ::
[ivy:resolve] :: loading settings :: url = jar:file:/opt/ant/lib/ivy-2.6.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:resolve] :: resolving dependencies :: com.example#ivy-demo;1.0
[ivy:resolve]   confs: [default]
[ivy:resolve]   found org.apache.commons#commons-lang3;3.21.0 in public
[ivy:resolve]   [3.21.0] org.apache.commons#commons-lang3;3.+
[ivy:resolve] downloading https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.21.0/commons-lang3-3.21.0.jar ...
[ivy:resolve] ........................
[ivy:resolve] ...................
[ivy:resolve] ............
[ivy:resolve] ........ (731kB)
[ivy:resolve] .. (0kB)
[ivy:resolve]   [SUCCESSFUL ] org.apache.commons#commons-lang3;3.21.0!commons-lang3.jar (7138ms)
[ivy:resolve] :: resolution report :: resolve 15281ms :: artifacts dl 7142ms
        ---------------------------------------------------------------------
        |                  |            modules            ||   artifacts   |
        |       conf       | number| search|dwnlded|evicted|| number|dwnlded|
        ---------------------------------------------------------------------
        |      default     |   1   |   1   |   1   |   0   ||   1   |   1   |
        ---------------------------------------------------------------------

BUILD SUCCESSFUL
Total time: 23 seconds

要点:3.+ 实际解析为 Maven Central 当前最新的 3.21.0;仓库标识 public 来自 Ivy 默认 settings 的解析链。

7.2 ant retrieve(二次 resolve 走缓存)

[ivy:resolve] :: resolution report :: resolve 3351ms :: artifacts dl 1ms
        |      default     |   1   |   0   |   0   |   0   ||   1   |   0   |

retrieve:
[ivy:retrieve] :: retrieving :: com.example#ivy-demo
[ivy:retrieve]  confs: [default]
[ivy:retrieve]  1 artifacts copied, 0 already retrieved (731kB/5ms)

BUILD SUCCESSFUL
Total time: 3 seconds
=== lib 目录内容 ===
total 740
-rw-r--r-- 1 root root 749083 Sep 25 20:01 commons-lang3.jar

7.3 ant run 与手动 javac 验证

run:
     [java] Hello apache ivy
     [java] reverse: yvi ehcapa olleH
     [java] abbreviate: Apache Ivy is a power...

BUILD SUCCESSFUL
Total time: 1 second
javac -cp lib/commons-lang3.jar -d build/classes src/Hello.java
java -cp build/classes:lib/commons-lang3.jar Hello
Hello apache ivy
reverse: yvi ehcapa olleH
abbreviate: Apache Ivy is a power...

7.4 ant report(生成依赖报告)

report:
[ivy:report] Processing /root/.ivy2/cache/com.example-ivy-demo-default.xml to /root/ivy-demo/report/com.example-ivy-demo-default.html
[ivy:report] Processing /root/.ivy2/cache/com.example-ivy-demo-default.xml to /root/ivy-demo/report/com.example-ivy-demo-default.graphml

BUILD SUCCESSFUL
Total time: 3 seconds

产物:report/com.example-ivy-demo-default.html(6,322B)、.graphml(1,917B)、ivy-report.css(4,680B)。

八、独立 CLI 运行方式(不装 Ant)

ivy-2.6.0.jar 可脱离 Ant 直接运行,适合 CI 或临时排查依赖:

java -jar /opt/apache-ivy-2.6.0/ivy-2.6.0.jar -dependency commons-lang commons-lang 2.6
:: loading settings :: url = jar:file:/opt/apache-ivy-2.6.0/ivy-2.6.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
:: resolving dependencies :: commons-lang#commons-lang-caller;working
        confs: [default]
        found commons-lang#commons-lang;2.6 in public
        found junit#junit;3.8.1 in public
downloading https://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-javadoc.jar ...
.................................................................................................................................. (1585kB)
.. (0kB)
        [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(javadoc) (10295ms)
downloading https://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6-sources.jar ...
......................... (364kB)
.. (0kB)
        [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar(source) (2781ms)
downloading https://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6.jar ...
..................... (277kB)
.. (0kB)
        [SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar (3241ms)
downloading https://repo1.maven.org/maven2/junit/junit/3.8.1/junit-3.8.1.jar ...
......... (118kB)
.. (0kB)
        [SUCCESSFUL ] junit#junit;3.8.1!junit.jar (2126ms)
:: resolution report :: resolve 9704ms :: artifacts dl 18449ms

要点:CLI 模式自动解析传递依赖(commons-lang 2.6 → junit 3.8.1),且默认连 javadoc/sources 分类件一并下载(4 个 artifact);产物只进缓存 /root/.ivy2/cache,不会自动落到当前目录,需要落盘必须加 -retrieve(pattern 写法见 FAQ Q6)。完整 CLI 详解见本套件《Apache Ivy 2.6.0 常用 CLI 命令与工具详解》。

九、升级、卸载与缓存管理

操作命令/路径
缓存目录/root/.ivy2/cache/(默认,可用 -Divy.cache.dir 或 settings 中 ivy.cache.default 改)
清缓存rm -rf /root/.ivy2/cache(下次 resolve 全量重下)
升级 Ivy下载新版 jar 后覆盖 $ANT_HOME/lib/ivy-*.jar,注意删除旧版避免双 jar 冲突
卸载删除 /opt/apache-ivy-2.6.0/ 与 /opt/ant/lib/ivy-2.6.0.jar 即可,Ant 本身不受影响
历史版本2.5.0/2.5.1/2.5.2/2.5.3 等仅存于 https://archive.apache.org/dist/ant/ivy/<版本>/,dlcdn 只保留最新版

十、FAQ(实测排障)

Q1:curl https://dlcdn.apache.org/ivy/ 返回 404? Ivy 在 dlcdn 的正确路径是 https://dlcdn.apache.org/ant/ivy/(隶属 Ant 项目)。实测 curl -sI https://dlcdn.apache.org/ivy/ → HTTP/2 404。

Q2:下载 2.5.x 报 404? dlcdn 只保留"当前推荐版"(现为 2.6.0)。实测 dlcdn.apache.org/ant/ivy/2.5.2/... → 404;历史版本用 https://archive.apache.org/dist/ant/ivy/2.5.2/apache-ivy-2.5.2-bin-with-deps.tar.gz(实测 200,但 archive 响应头自带 Vary: Slow,Glacial,下载慢属正常)。

Q3:Java 17 运行 Ivy 2.6.0 会不会不兼容? 不会。Ivy 2.6.0 由 Java 11 构建(MANIFEST Created-By: 11.0.31+11-...-Ubuntu),在 OpenJDK 17.0.20.1 下 resolve/retrieve/report/CLI 全部实测通过。不兼容场景只出现在"老 Ivy 配新 JDK"(如 2.4.x 配 Java 17)。

Q4:ant resolve 报 Problem: failed to select a version? 动态版本(如 3.+)解析不到任何匹配时触发。检查仓库可达性(repo1.maven.org)与 org/name 拼写;内网可换镜像仓库(见配置详解篇)。

Q5:ivy:report 报缺 xslt 依赖? 使用极简 bin 包且裁剪过 settings 时可能出现;bin-with-deps 包实测一次通过。优先用 with-deps 包。

Q6:-retrieve 报 Multiple artifacts of the module ... are retrieved to the same file!? pattern 缺少类型维度。实测报错原文:java.lang.RuntimeException: Multiple artifacts of the module commons-lang#commons-lang;2.6 are retrieved to the same file!。把 cli/[artifact].[ext] 改成 cli/[artifact]-[type].[ext] 即可(jar/javadoc/sources 三类件不再同名互覆)。

Q7:resolve 很慢怎么提速? 默认走 repo1.maven.org。可改用镜像(如阿里云 https://maven.aliyun.com/repository/public),在自定义 ivysettings.xml 的 ibiblio resolver 中替换 root(见配置详解篇)。实测 repo1 约 60KB/s、aliyun 可达 1.6MB/s 量级。

Q8:下载中断怎么办? Ivy 对仓库下载本身无断点续传,rm -rf /root/.ivy2/cache/<org>-<module> 后重跑 resolve 即可;发行包下载用 curl -C - 续传。

Q9:如何固定动态版本? resolve 成功后 Ivy 会把解析结果写进缓存 com.example-ivy-demo-default.xml;要固化版本直接把 ivy.xml 中 rev="3.+" 改成解析出的 3.21.0,或用 ivy:deliver 生成锁定版描述符。

Q10:容器/最小环境需要装 Ant 吗? 只需 CLI 时不用装 Ant,java -jar ivy-2.6.0.jar 即可(第八章)。需要 build.xml 编排编译时再装 Ant。

参考链接