Apache Commons IO 常用 CLI 命令与工具详解
汇总 Apache Commons IO 2.22.0 开发运维常用命令:curl 下载、sha512sum 校验、tar 解压、jar/javap/jdeps 检查 jar、javac/java 编译运行、mvn 构建打包,附实测回显。
Apache Commons IO 常用 CLI 命令与工具详解
目标:汇总 Apache Commons IO 2.22.0 从获取、校验、检查到编译运行、构建打包的完整命令行工具箱,每条命令均附 JDK 17 环境实测回显与常见报错解法;本文命令在 Ubuntu 22.04 与 CentOS 8 上均已实测通过。
Apache Commons IO 是纯 Java 库,命令行操作集中在两类:一类是通用的文件工具(curl、sha512sum、tar、jar、javap、jdeps、javac、java),另一类是 Maven 构建命令(dependency:get、dependency:tree、package)。前者负责把 jar「拿到手并验证可用」,后者负责把依赖「引入工程并打出可运行产物」。本文按「下载校验 → 内容检查 → 编译运行 → 构建打包」的链路逐条讲解。
一、环境信息
本文命令在以下环境实测:
- 操作系统:Ubuntu 22.04.5 LTS(x86_64),部分命令在 CentOS 8 复测一致
- JDK:OpenJDK 17.0.20.1(
javac/java/jar/javap/jdeps均为 JDK 自带) - 构建工具:Apache Maven 3.6.3(CentOS 8 为 3.5.4,命令兼容)
- 组件版本:commons-io 2.22.0
- 官方发布物:
commons-io-2.22.0-bin.tar.gz(9027936 字节) - 示例工程:
/root/commons-io-demo
二、工具概览
本节先给工具全景表,后续小节逐一详解。所有工具均为 Linux 发行版自带或 JDK/Maven 自带,无需额外安装。
| 工具 | 来源 | 用途 | 本文对应小节 |
|---|---|---|---|
| curl | 系统自带 | 从网络下载官方发布物与校验文件 | 4.1 |
| sha512sum / sha1sum | 系统自带 | 校验下载文件完整性 | 4.2 |
| tar | 系统自带 | 解压发布物 | 4.3 |
| jar | JDK 自带 | 查看 jar 内容清单 | 4.4 |
| javap | JDK 自带 | 反汇编查看类结构与字节码版本 | 4.5 |
| jdeps | JDK 自带 | 分析 jar 依赖 | 4.6 |
| javac | JDK 自带 | 编译 Java 源码 | 4.7 |
| java | JDK 自带 | 运行 class/jar | 4.8 |
| mvn | Maven 自带 | 拉依赖、查依赖树、打包 | 4.9–4.11 |
三、前置条件
- 已安装 JDK 17(
javac -version可用)与 Maven(mvn -version可用)。 - 可访问
downloads.apache.org与repo1.maven.org(本文实测网络直连可达)。 - 具备联网下载与写
/root目录的权限。 - 中文输出环境:
LANG为空时,java运行命令需带-Dstdout.encoding=UTF-8 -Dfile.encoding=UTF-8。
环境确认(实时回显):
javac -version && mvn -version | head -1
javac 17.0.20.1
Apache Maven 3.6.3
四、各工具详解
4.1 curl:下载官方发布物
从 Apache 官方下载站拉取 bin 包与配套 sha512 校验文件:
cd /root && curl -sO --max-time 60 https://downloads.apache.org/commons/io/binaries/commons-io-2.22.0-bin.tar.gz
curl -sO --max-time 30 https://downloads.apache.org/commons/io/binaries/commons-io-2.22.0-bin.tar.gz.sha512
ls -l commons-io-2.22.0-bin.tar.gz
-rw-r--r-- 1 root root 9027936 Oct 13 17:40 commons-io-2.22.0-bin.tar.gz
要点:-s 静默、-O 按远程文件名落盘、--max-time 设置超时防挂起。若网络较慢可加大超时,如 --max-time 120。下载后务必做 4.2 节的校验,不要跳过。
4.2 sha512sum:校验完整性
官方在每个 bin 包旁提供 .sha512 文件(内含期望哈希),用 sha512sum 计算实测哈希并逐字比对:
echo "期望: $(cat commons-io-2.22.0-bin.tar.gz.sha512)"
echo "实测: $(sha512sum commons-io-2.22.0-bin.tar.gz | cut -d' ' -f1)"
期望: aa8184f097ee9d43b2fbe56a82ca1ed3f0f4c153687cc18c4d218601948270a92a69c36224317db236715064946a3799727de5c3e57c536ddbaf61a98d84c737
实测: aa8184f097ee9d43b2fbe56a82ca1ed3f0f4c153687cc18c4d218601948270a92a69c36224317db236715064946a3799727de5c3e57c536ddbaf61a98d84c737
期望与实测逐字一致即校验通过。从 Maven 中央仓库拿单个 jar 时用配套 .sha1 文件做同样比对:
cd /root && curl -sO --max-time 60 https://repo1.maven.org/maven2/commons-io/commons-io/2.22.0/commons-io-2.22.0.jar
curl -sO --max-time 30 https://repo1.maven.org/maven2/commons-io/commons-io/2.22.0/commons-io-2.22.0.jar.sha1
echo "期望: $(cat commons-io-2.22.0.jar.sha1)"
echo "实测: $(sha1sum commons-io-2.22.0.jar | cut -d' ' -f1)"
期望: 5b1e18bc0ad651ed878029d83f88d9c8189fd51e
实测: 5b1e18bc0ad651ed878029d83f88d9c8189fd51e
4.3 tar:解压与查看发布物
解压 bin 包并列出内容:
tar xzf commons-io-2.22.0-bin.tar.gz && ls commons-io-2.22.0/
LICENSE.txt
NOTICE.txt
RELEASE-NOTES.txt
commons-io-2.22.0-javadoc.jar
commons-io-2.22.0-sources.jar
commons-io-2.22.0-test-sources.jar
commons-io-2.22.0-tests.jar
commons-io-2.22.0.jar
docs
要点:x 解压、z 处理 gzip、f 指定文件名。主 jar 是 commons-io-2.22.0.jar(609182 字节);-javadoc.jar 是 API 文档、-sources.jar 是源码,docs/ 目录内含官方说明。
4.4 jar:查看 jar 内容
用 jar tf 列出 jar 内全部条目(t=列表、f=文件),实测 2.22.0 共 458 个条目:
cd /root/commons-io-2.22.0 && jar tf commons-io-2.22.0.jar | wc -l
458
查看指定类是否在 jar 内(如核心类 FileUtils):
jar tf commons-io-2.22.0.jar | grep -E "FileUtils|IOUtils|Tailer\.class"
org/apache/commons/io/FileUtils.class
org/apache/commons/io/IOUtils.class
org/apache/commons/io/input/Tailer.class
4.5 javap:查看类结构与字节码版本
javap 反汇编 class 文件,可确认类的方法签名、常量与字节码版本。查看 IOUtils 的字节码主版本号(判断 jar 兼容的 JDK 基线):
javap -verbose -cp commons-io-2.22.0.jar org.apache.commons.io.IOUtils | grep -E "major version|minor version"
minor version: 0
major version: 52
主版本号 52 即 Java 8——说明 2.22.0 最低要求 JDK 8,JDK 8 及以上均可直接运行。查看私有常量默认值(如 Tailer 内部常量)加 -p -constants:
javap -p -constants -cp commons-io-2.22.0.jar org.apache.commons.io.input.Tailer | grep DEFAULT
private static final boolean DEFAULT_IGNORE_TOUCH = false;
private static final int DEFAULT_DELAY_MILLIS = 1000;
4.6 jdeps:依赖分析
jdeps 分析 jar 依赖的 JDK 模块。2.22.0 是 multi-release jar(含多版本 class),直接运行会要求显式指定版本(实测回显):
jdeps commons-io-2.22.0.jar
Error: commons-io-2.22.0.jar is a multi-release jar file but --multi-release option is not set
加 --multi-release=base 后正常输出依赖模块(实测回显):
jdeps --multi-release=base commons-io-2.22.0.jar | head -4
commons-io-2.22.0.jar -> java.base
org.apache.commons.io -> java.io java.base
org.apache.commons.io -> java.lang java.base
org.apache.commons.io -> java.lang.invoke java.base
要点:输出 commons-io-2.22.0.jar -> java.base 表示它只依赖 JDK 基础模块,无第三方传递依赖,这正是「轻量工具库」的体现。
4.7 javac:编译 Java 源码
用官方 jar 作为编译期 classpath 编译 Demo.java:
mkdir -p /root/jar-run && cd /root/jar-run
cp /root/commons-io-2.22.0/commons-io-2.22.0.jar .
cp /root/commons-io-demo/src/main/java/Demo.java .
javac -encoding UTF-8 -cp commons-io-2.22.0.jar -d out Demo.java
Note: Demo.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
要点:-encoding UTF-8 必须带(源码含中文注释/字符串时,缺省会按平台编码解析导致编译错乱);-cp 指定 jar 路径;-d out 指定 class 输出目录。deprecated API 提示属正常——Demo 用到了 2.22.0 已标记过时的 Tailer.create,功能不受影响。
4.8 java:运行 class 与 jar
运行编译产物(-cp out:jar 拼 classpath,class 输出目录在前):
java -Dstdout.encoding=UTF-8 -Dfile.encoding=UTF-8 -cp out:commons-io-2.22.0.jar Demo | head -6
工作目录: /root/io-demo-work 存在=true
---- [1] FileUtils.writeStringToFile / readFileToString ----
Hello Commons IO
第二行 中文
第三行
文件字节数=44, 文本行数=3
若工程已用 Maven 打包成胖 jar(见 4.11),则直接 java -jar 运行:
java -Dstdout.encoding=UTF-8 -Dfile.encoding=UTF-8 -jar /root/commons-io-demo/target/commons-io-demo.jar | head -3
工作目录: /root/io-demo-work 存在=true
---- [1] FileUtils.writeStringToFile / readFileToString ----
Hello Commons IO
要点:-jar 方式要求 jar 的 Main-Class 清单项已设置(shade 打包时配置);-cp 方式不要求清单,适合临时运行。
4.9 mvn dependency:get:从中央仓库拉取依赖
不想手动下载 jar 时,用 Maven 直接拉取坐标到本地仓库:
mvn -B dependency:get -Dartifact=commons-io:commons-io:2.22.0
[INFO] BUILD SUCCESS
执行成功后 jar 已缓存到 ~/.m2/repository/commons-io/commons-io/2.22.0/,可立即被其他工程复用。
4.10 mvn dependency:tree:查看依赖树
在工程目录查看实际生效的依赖版本:
cd /root/commons-io-demo && mvn -q -B dependency:tree | grep commons-io
[INFO] \- commons-io:commons-io:jar:2.22.0:compile
要点:\- 前缀表示它是直接依赖(非传递依赖),compile 是依赖范围。若 pom 声明其他版本而树里显示不同版本,说明存在依赖仲裁,以树为准。
4.11 mvn package:打包可执行 jar
在工程目录执行完整构建(编译 + 测试 + 打包 + shade 合并依赖):
cd /root/commons-io-demo && mvn -B package | tail -6
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing /root/commons-io-demo/target/commons-io-demo.jar with /root/commons-io-demo/target/commons-io-demo-1.0.0-shaded.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.499 s
[INFO] ------------------------------------------------------------------------
产物核对:
ls -l /root/commons-io-demo/target/*.jar
-rw-r--r-- 1 root root 618984 Oct 13 17:49 target/commons-io-demo.jar
-rw-r--r-- 1 root root 10998 Oct 13 17:49 target/original-commons-io-demo.jar
commons-io-demo.jar(约 619 KB)为内嵌 commons-io 的胖 jar,original-commons-io-demo.jar 为不含依赖的原始 jar。
五、注意事项
本节汇总上述命令的高频注意点。
- 校验不可省:下载后必须用 sha512(bin 包)或 sha1(中央仓库 jar)比对,期望与实测不一致时删除重下。
- javac 必须带
-encoding UTF-8:源码含中文时,缺省会按平台编码(POSIX 下为 ASCII)解析,轻则乱码重则编译失败。 - java 运行中文输出带两个
-D参数:-Dstdout.encoding=UTF-8 -Dfile.encoding=UTF-8,否则 POSIX locale 下打印乱码。 - jdeps 对 multi-release jar 需
--multi-release=base:否则直接报错(见 4.6)。 - jar 直跑与 java -jar 的选择:临时验证用
-cp out:jar,正式分发用 shade 打包后的-jar。 - CentOS 8 的 Maven 绑定差异:Maven 3.5.4 默认绑定 Java 8,需先
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64再执行mvn命令,否则编译 17 目标报invalid target release: 17(详见《CentOS 8 安装 Apache Commons IO 指南》4.4 节)。
六、常见问题(FAQ)
Q1:sha512sum 比对结果不一致怎么办?
说明下载包损坏或被篡改。删除本地文件后重新 curl 下载,并再次校验;若持续不一致,尝试更换网络(如公司代理)后重试。
Q2:jdeps 报 is a multi-release jar file but --multi-release option is not set?
2.22.0 是 multi-release jar,加 --multi-release=base 参数即可正常分析(见 4.6 节回显)。
Q3:javac 编译中文源码报错或生成乱码 class?
编译命令缺少 -encoding UTF-8。加上该参数后重新编译;同时确认源文件本身以 UTF-8 保存。
Q4:java 运行中文输出全是问号?
POSIX locale 下 JVM 用 ASCII 输出。运行命令带 -Dstdout.encoding=UTF-8 -Dfile.encoding=UTF-8(见 4.8 节)。
Q5:mvn dependency:get 一直下载不动或超时?
先确认 repo1.maven.org 可达(curl -sI https://repo1.maven.org | head -1 应返回 200);网络受限时在 ~/.m2/settings.xml 中配置内网仓库地址(<mirror> 指向可达的私服)。
Q6:java -jar 报 no main manifest attribute?
jar 未设置 Main-Class。用 shade 插件打包时在 pom.xml 中配置 ManifestResourceTransformer 的 mainClass(见《Ubuntu 22.04 安装 Apache Commons IO 指南》4.4 节),或改用 java -cp out:jar 主类名 运行。
七、参考链接
- Apache Commons IO 官方主页:https://commons.apache.org/proper/commons-io/
- Apache Commons IO 官方下载目录:https://downloads.apache.org/commons/io/
- Maven 中央仓库 commons-io 坐标:https://repo1.maven.org/maven2/commons-io/commons-io/
- OpenJDK 工具说明(javac/java/jar/javap/jdeps):https://docs.oracle.com/en/java/javase/17/docs/specs/man/index.html
- Maven 常用命令参考:https://maven.apache.org/plugins/maven-dependency-plugin/
- maven-shade-plugin 官方说明:https://maven.apache.org/plugins/maven-shade-plugin/