Ubuntu 22.04 安装 Apache Commons VFS 指南
在 Ubuntu 22.04 上通过 Maven 依赖与官方二进制包两种方案安装 Apache Commons VFS 2.10.0,并用最小工程验证可用的完整实测指南
Ubuntu 22.04 安装 Apache Commons VFS 指南
目标:在 Ubuntu 22.04 服务器上完成 Apache Commons VFS 2.10.0 的安装与最小可用验证,覆盖 Maven 依赖与官方 bin 包两种方案,已在 Ubuntu 22.04 实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- 架构:x86_64
- JDK:OpenJDK 17.0.20.1(apt 源 openjdk-17-jdk)
- 构建工具:Apache Maven 3.6.3(apt 源 maven)
- 组件版本:Apache Commons VFS 2.10.0(当前 2.x 系列最新稳定版)
- Maven 坐标:org.apache.commons:commons-vfs2:2.10.0
- 工作目录:/root/vfs-demo(Maven 工程)、/root/jar-run(jar 直跑)、/root/vfs-work(验证输出)
实测环境确认:
head -2 /etc/os-release && uname -m
实测回显:
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
x86_64
二、前置条件
安装开始前确认以下事项:
- 具备 root 权限(本文命令以 root 执行)。
- 服务器可访问互联网:需要访问 downloads.apache.org(官方包)与 repo1.maven.org(Maven 中央仓库)。
- 磁盘空间:openjdk-17-jdk 与 maven 安装约需 500 MB。
- 已安装 curl 用于下载与校验(若无,安装命令见 4.2 节)。
网络连通性实测:
curl -sI --max-time 20 https://downloads.apache.org/commons/vfs/ | head -3
curl -sI --max-time 20 https://repo1.maven.org/maven2/org/apache/commons/commons-vfs2/2.10.0/commons-vfs2-2.10.0.jar | head -1
实测回显:
HTTP/1.1 200 OK
Date: Thu, 15 Oct 2026 01:26:55 GMT
Server: Apache
---
HTTP/2 200
验证结果:两个下载源均可达。
三、版本选型说明
Commons VFS 提供统一 API(FileSystemManager/FileObject)访问本地文件、内存文件系统与 zip/tar/jar 等归档,及 ftp/sftp/http 等远程文件。选型要点:
- 坐标名称:2.x 系列的 Maven 构件名是 commons-vfs2(groupId 为 org.apache.commons);1.x 的旧构件 commons-vfs:commons-vfs 已停止维护。
- Java 基线:2.10.0 主 jar 字节码版本为 major 52,即 Java 8 起可用,JDK 17 编译运行无兼容问题。
- 最新稳定版:截至 2026 年 10 月,官方下载目录的最新版本目录为 2.10.0(同目录下仅保留最新一版)。
官方下载目录列表实测:
curl -s https://downloads.apache.org/commons/vfs/ | grep -oE 'href="[^"]*"' | grep -vE 'href="/|href="#"' | sort -u
实测回显:
href="/commons/"
href="2.10.0/"
href="[SRC]"
href="[TXT]"
href="[binaries]"
验证结果:2.x 系列在官网只有 2.10.0 一个版本目录,即当前最新稳定版。
💡 技术拓展:文件系统访问库选型对比
方案 定位 支持后端 适用场景 Apache Commons VFS 虚拟文件系统门面 本地、ram、zip/tar/jar、ftp/sftp/http 等插件式 后端种类多且需运行期切换 JDK NIO + zipfs JDK 内置 本地、zip(FileSystems.newFileSystem) 仅本地与 zip 时零依赖 Apache Commons IO 工具函数集 无虚拟化(仅 java.io 增强) 已有文件句柄,缺工具方法 commons-net / JSch 协议客户端 单一协议 固定协议且无需统一抽象 本文选用 Commons VFS 2.10.0:一套 resolveFile URI 写法覆盖本地与归档后端。
四、方案 A:Maven 依赖安装(在线,推荐)
4.1 方案说明
用 apt 安装 JDK 17 与 Maven,再创建 Maven 工程引入 commons-vfs2 依赖。依赖会自动带入运行必需的传递依赖,日常开发首选。
4.2 安装 JDK 17
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-17-jdk
实测回显(输出节选,实测首尾):
The following NEW packages will be installed:
maven media-types networkd-dispatcher openjdk-11-jre-headless openjdk-17-jdk
1 upgraded, 224 newly installed, 0 to remove and 2 not upgraded.
验证版本:
java -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)
验证结果:OpenJDK 17.0.20.1 安装成功。
4.3 安装 Maven
DEBIAN_FRONTEND=noninteractive apt-get install -y maven curl
验证版本:
mvn -version | head -4
实测回显:
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
Default locale: en_US, platform encoding: ANSI_X3.4-1968
验证结果:Maven 3.6.3 就绪。platform encoding 显示 ANSI_X3.4-1968 是 POSIX locale 下的正常现象,运行含中文输出的程序时用 -Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 指定编码即可(详见 4.6 节)。
4.4 创建工程并引入依赖
mkdir -p /root/vfs-demo/src/main/java
写入 /root/vfs-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>vfs-check</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>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-vfs2</artifactId>
<version>2.10.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
</plugin>
</plugins>
</build>
</project>
关键配置说明:
- commons-vfs2 坐标为 org.apache.commons:commons-vfs2:2.10.0,其余依赖全部由其自动带入。
- 显式固定 maven-compiler-plugin 版本为 3.11.0,避免 Maven 3.6.3 内置默认旧版插件按 Java 5 语法级别编译。
- maven.compiler.release=17 与 JDK 17 匹配;若后续要产出 Java 8 字节码,改为 maven.compiler.source 与 maven.compiler.target 等于 1.8。
4.5 最小验证代码
写入 /root/vfs-demo/src/main/java/VfsCheck.java:
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemManager;
import org.apache.commons.vfs2.VFS;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class VfsCheck {
public static void main(String[] args) throws Exception {
FileSystemManager mgr = VFS.getManager();
System.out.println("FileSystemManager = " + mgr.getClass().getName());
FileObject f = mgr.resolveFile("/root/vfs-work/check.txt");
f.getParent().createFolder();
try (OutputStream out = f.getContent().getOutputStream()) {
out.write("Hello Apache Commons VFS 2.10.0\n".getBytes(StandardCharsets.UTF_8));
}
System.out.println("本地文件: " + f.getName().getURI() + " 大小=" + f.getContent().getSize() + " 字节");
FileObject ram = mgr.resolveFile("ram:///check.txt");
try (OutputStream out = ram.getContent().getOutputStream()) {
out.write("RAM OK".getBytes(StandardCharsets.UTF_8));
}
System.out.println("内存文件: " + ram.getName().getURI() + " 内容=" + ram.getContent().getString(StandardCharsets.UTF_8));
System.out.println("VFS OK");
}
}
代码同时覆盖两类提供者:file(本地磁盘)与 ram(内存文件系统),是 VFS 最小可用性的充分验证。
4.6 编译与运行验证
cd /root/vfs-demo
mvn -q -B compile dependency:build-classpath -Dmdep.outputFile=/root/vfs-demo/cp.txt
ls target/classes/VfsCheck.class
实测回显:
target/classes/VfsCheck.class
验证结果:编译成功,依赖清单已写入 cp.txt。
查看实际带入的传递依赖:
mvn -B dependency:tree | grep -A 5 "demo:vfs-check:jar"
实测回显:
[INFO] demo:vfs-check:jar:1.0.0
[INFO] \- org.apache.commons:commons-vfs2:jar:2.10.0:compile
[INFO] +- commons-logging:commons-logging:jar:1.3.4:compile
[INFO] +- org.apache.commons:commons-lang3:jar:3.17.0:compile
[INFO] \- commons-io:commons-io:jar:2.18.0:compile
运行验证程序:
java -Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -cp target/classes:$(cat cp.txt) VfsCheck
实测回显:
FileSystemManager = org.apache.commons.vfs2.impl.StandardFileSystemManager
本地文件: file:///root/vfs-work/check.txt 大小=32 字节
内存文件: ram:///check.txt 内容=RAM OK
VFS OK
验证结果:本地文件写入并读出 32 字节,ram 内存文件读写正常,安装完成。
💡 技术拓展:运行期编码参数
参数 作用 何时需要 -Dfile.encoding=UTF-8 JVM 默认字符集 POSIX locale 服务器(platform encoding 为 ANSI_X3.4-1968) -Dstdout.encoding=UTF-8 System.out 编码 JDK 18 起 System.out 不再跟随 file.encoding;本例 17 下两者同用最稳 本文实测环境 platform encoding 为 ANSI_X3.4-1968,不加参数时中文输出为问号乱码,加参数后正常。
五、方案 B:官方 bin 包 + jar 直跑(离线友好)
5.1 方案说明
直接使用官方二进制发行包 commons-vfs-2.10.0-bin.tar.gz 中的主 jar,再补齐 3 个运行必需的依赖 jar,用 javac/java 按 classpath 编译运行。适合无 Maven 私服、受限网络或脚本化部署场景。bin 包内主 jar 与模块 jar 齐全但不含依赖 jar,依赖需从 Maven 中央仓库单独获取。
5.2 下载与完整性校验
cd /root
curl -sO https://downloads.apache.org/commons/vfs/binaries/commons-vfs-2.10.0-bin.tar.gz
curl -sO https://downloads.apache.org/commons/vfs/binaries/commons-vfs-2.10.0-bin.tar.gz.sha512
ls -l commons-vfs-2.10.0-bin.tar.gz
echo 期望: $(cat commons-vfs-2.10.0-bin.tar.gz.sha512)
echo 实测: $(sha512sum commons-vfs-2.10.0-bin.tar.gz | awk '{print $1}')
实测回显:
-rw-r--r-- 1 root root 5755129 Oct 15 01:04 commons-vfs-2.10.0-bin.tar.gz
期望: c9f4813676213604c0d6fd47f819670defa9b4b3c3642301386e46ce42102693c026a61c44d7b8fbea31894d6aca7a7ffd2381b3e35716c629e460263991129b
实测: c9f4813676213604c0d6fd47f819670defa9b4b3c3642301386e46ce42102693c026a61c44d7b8fbea31894d6aca7a7ffd2381b3e35716c629e460263991129b
验证结果:文件 5755129 字节,SHA-512 一致。
5.3 解压
tar xzf commons-vfs-2.10.0-bin.tar.gz
ls commons-vfs-2.10.0/
ls -l commons-vfs-2.10.0/commons-vfs2-2.10.0.jar
实测回显:
LICENSE.txt
NOTICE.txt
RELEASE-NOTES.txt
commons-vfs2-2.10.0-javadoc.jar
commons-vfs2-2.10.0-sources.jar
commons-vfs2-2.10.0-test-sources.jar
commons-vfs2-2.10.0-tests.jar
commons-vfs2-2.10.0.jar
commons-vfs2-ant-2.10.0-javadoc.jar
commons-vfs2-ant-2.10.0-sources.jar
commons-vfs2-ant-2.10.0-test-sources.jar
commons-vfs2-ant-2.10.0-tests.jar
commons-vfs2-ant-2.10.0.jar
commons-vfs2-examples-2.10.0-javadoc.jar
commons-vfs2-examples-2.10.0-sources.jar
commons-vfs2-examples-2.10.0.jar
commons-vfs2-hdfs-2.10.0-javadoc.jar
commons-vfs2-hdfs-2.10.0-sources.jar
commons-vfs2-hdfs-2.10.0-test-sources.jar
commons-vfs2-hdfs-2.10.0-tests.jar
commons-vfs2-hdfs-2.10.0.jar
commons-vfs2-jackrabbit1-2.10.0-javadoc.jar
commons-vfs2-jackrabbit1-2.10.0-sources.jar
commons-vfs2-jackrabbit1-2.10.0-test-sources.jar
commons-vfs2-jackrabbit1-2.10.0-tests.jar
commons-vfs2-jackrabbit1-2.10.0.jar
commons-vfs2-jackrabbit2-2.10.0-javadoc.jar
commons-vfs2-jackrabbit2-2.10.0-sources.jar
commons-vfs2-jackrabbit2-2.10.0-test-sources.jar
commons-vfs2-jackrabbit2-2.10.0-tests.jar
commons-vfs2-jackrabbit2-2.10.0.jar
-rw------- 1 root root 534044 Feb 1 2025 commons-vfs-2.10.0/commons-vfs2-2.10.0.jar
验证结果:主 jar commons-vfs2-2.10.0.jar(534044 字节)就绪,包内另有 examples、ant、hdfs、jackrabbit 等模块 jar。
5.4 依赖 jar 下载与校验
jar 直跑最小 classpath 需要 3 个依赖 jar(与 4.6 节依赖树一致:commons-logging、commons-lang3、commons-io):
mkdir -p /root/jar-run && cd /root/jar-run
cp /root/vfs-demo/src/main/java/VfsCheck.java .
R=https://repo1.maven.org/maven2
curl -sO $R/commons-logging/commons-logging/1.3.4/commons-logging-1.3.4.jar
curl -sO $R/commons-logging/commons-logging/1.3.4/commons-logging-1.3.4.jar.sha1
curl -sO $R/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.jar
curl -sO $R/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.jar.sha1
curl -sO $R/commons-io/commons-io/2.18.0/commons-io-2.18.0.jar
curl -sO $R/commons-io/commons-io/2.18.0/commons-io-2.18.0.jar.sha1
for j in commons-logging-1.3.4 commons-lang3-3.17.0 commons-io-2.18.0; do echo "$j 期望: $(cat $j.jar.sha1) 实测: $(sha1sum $j.jar | awk '{print $1}')"; done
实测回显:
commons-logging-1.3.4 期望: b9fc14968d63a8b8a8a2c1885fe3e90564239708 实测: b9fc14968d63a8b8a8a2c1885fe3e90564239708
commons-lang3-3.17.0 期望: b17d2136f0460dcc0d2016ceefca8723bdf4ee70 实测: b17d2136f0460dcc0d2016ceefca8723bdf4ee70
commons-io-2.18.0 期望: 44084ef756763795b31c578403dd028ff4a22950 实测: 44084ef756763795b31c578403dd028ff4a22950
验证结果:3 个依赖 jar 的 SHA-1 全部一致。若需 zip/tar 等归档提供者,按同样方法补 commons-compress-1.27.1.jar(其自身还依赖 commons-codec-1.17.1.jar)。
5.5 编译与运行
cd /root/jar-run
javac -encoding UTF-8 -cp /root/commons-vfs-2.10.0/commons-vfs2-2.10.0.jar -d out VfsCheck.java
java -Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -cp out:/root/commons-vfs-2.10.0/commons-vfs2-2.10.0.jar:commons-logging-1.3.4.jar:commons-lang3-3.17.0.jar:commons-io-2.18.0.jar VfsCheck
实测回显:
编译成功
FileSystemManager = org.apache.commons.vfs2.impl.StandardFileSystemManager
本地文件: file:///root/vfs-work/check.txt 大小=32 字节
内存文件: ram:///check.txt 内容=RAM OK
VFS OK
验证结果:无 Maven 参与,纯 classpath 方式同样运行成功。
六、方案对比与选择建议
| 维度 | 方案 A:Maven 依赖 | 方案 B:bin 包 + jar 直跑 |
|---|---|---|
| 网络要求 | 首次构建需访问中央仓库 | 一次性下载 4 个 jar,之后可完全离线 |
| 依赖管理 | 传递依赖自动解析与升级 | 手工维护 classpath 与校验 |
| 升级成本 | 改 pom 版本号重新构建 | 替换全部 jar 并重新校验 |
| 可复现性 | 高(pom 锁定版本) | 中(依赖脚本或目录约定) |
| 适用场景 | 常规开发与持续集成 | 受限网络、临时脚本、单机工具 |
选择建议:有构建工具一律用方案 A;离线交付或不需要构建体系的场景用方案 B。两者运行结果实测完全一致。
七、配置说明
7.1 环境变量
Ubuntu 的 openjdk-17-jdk 与 maven 包安装后已自动通过 /usr/lib/jvm 与 /usr/bin 软链接生效,无需手工设置 JAVA_HOME。若个别脚本需要显式指定:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
7.2 本地仓库位置
Maven 本地仓库默认在 /root/.m2/repository,Commons VFS 相关构件位于:
- /root/.m2/repository/org/apache/commons/commons-vfs2/2.10.0/(主构件)
- /root/.m2/repository/commons-logging/commons-logging/1.3.4/(运行必需)
- /root/.m2/repository/org/apache/commons/commons-lang3/3.17.0/(运行必需)
- /root/.m2/repository/commons-io/commons-io/2.18.0/(运行必需)
7.3 代码级配置入口
VFS 的运行期配置集中在 org.apache.commons.vfs2.VFS.getManager() 返回的 StandardFileSystemManager 上(提供者装配文件 providers.xml、缓存策略、FilesCache 等)。这属于应用级配置而非系统安装项,细节见《Apache Commons VFS 2.10.0 配置参数详解》。
八、多版本管理
本地仓库允许同时存在多个 commons-vfs2 版本,工程用哪个版本完全由 pom 决定。实测将 2.9.0 拉入本地仓库:
cd /root/vfs-demo
mvn -q -B dependency:get -Dartifact=org.apache.commons:commons-vfs2:2.9.0
ls -1 /root/.m2/repository/org/apache/commons/commons-vfs2/
实测回显:
2.10.0
2.9.0
验证结果:两个版本共存于本地仓库,切换版本只需修改 pom 中 dependency 的 version 后重新构建,不需要卸载任何旧版本。
⚠️ 注意:不要把 2.10.0 与 2.9.0 同时放进同一个 classpath,两个版本类名完全相同(都是 org.apache.commons.vfs2 包),同路径会按类加载顺序随机命中其一,引发不可预期的 NoSuchMethodError。
九、常见问题(FAQ)
9.1 运行报 NoClassDefFoundError: org/apache/commons/logging/Log
原因:classpath 缺少 commons-logging(VFS 的运行必需依赖)。方案 A 的 Maven 工程不会发生;方案 B 直跑时必须把 5.4 节的 3 个依赖 jar 全部加入 -cp。
9.2 解析 tar 报 "relative path, and no base URI was provided"
原因:tar/tbz2/bz2 等提供者在 jar 中以 if-available 条件注册,classpath 缺 commons-compress 时该提供者不安装,管理器把 tar: 前缀当作相对路径处理。引入 org.apache.commons:commons-compress 即恢复;zip 与 ram 提供者无此条件(zip 基于纯 JDK 实现),不受影响。
9.3 中文输出变问号
原因:POSIX locale 下 JVM 默认编码为 ANSI_X3.4-1968。解决:运行参数追加 -Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8,或修改系统 locale(localectl set-locale LANG=en_US.UTF-8 后重新登录)。
9.4 Maven 编译提示 Source option 5 is no longer supported
原因:Maven 3.6.3 的内置 compiler 插件默认版本过老且无 source/target 配置。解决:按 4.4 节在 pom 固定 maven-compiler-plugin 3.11.0 并设置 maven.compiler.release。
9.5 只想读 zip 是否必须引入 commons-compress
不需要。实测在仅含 vfs2、commons-logging、commons-lang3、commons-io 四个 jar 的 classpath 下,zip:file: 形式的归档读取正常(zip 提供者基于 JDK 自带实现)。commons-compress 是 tar/bz2 及 http/ftp/sftp 等扩展提供者的条件依赖,按需引入。
十、卸载与清理
清理验证工程与下载产物:
rm -rf /root/vfs-demo /root/jar-run /root/vfs-work /root/commons-vfs-2.10.0 /root/commons-vfs-2.10.0-bin.tar.gz
清理 Maven 本地仓库中的 VFS 构件(可选):
rm -rf /root/.m2/repository/org/apache/commons/commons-vfs2
卸载 apt 安装的 JDK 与 Maven(先用 -s 参数模拟确认清单再实际执行):
apt-get -s purge -y openjdk-17-jdk maven
实测回显(模拟输出,确认无误后去掉 -s 重新执行):
The following packages will be REMOVED:
maven* openjdk-17-jdk*
0 upgraded, 0 newly installed, 2 to remove and 2 not upgraded.
Purg maven [3.6.3-5]
Purg openjdk-17-jdk [17.0.20.1+1-1~22.04]
验证结果:模拟输出显示将移除 maven 与 openjdk-17-jdk 两个包(连带其附属包),确认后执行 apt-get purge -y openjdk-17-jdk maven 完成卸载。
十一、参考链接
- Apache Commons VFS 官网:https://commons.apache.org/proper/commons-vfs/
- 官方下载目录:https://downloads.apache.org/commons/vfs/
- Maven Central 构件页:https://repo1.maven.org/maven2/org/apache/commons/commons-vfs2/
- VFS 2.10.0 变更记录:https://commons.apache.org/proper/commons-vfs/changes-report.html
- VFS 用户指南:https://commons.apache.org/proper/commons-vfs/userguide.html