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 个常见问题排障
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) |
| JDK | Ivy 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。
参考链接
- Ivy 官网:https://ant.apache.org/ivy/
- 下载页(dlcdn,仅最新版):https://dlcdn.apache.org/ant/ivy/
- 历史版本归档:https://archive.apache.org/dist/ant/ivy/
- 官方文档目录(随发行包):
/opt/apache-ivy-2.6.0/doc/