Ubuntu 22.04 安装 Apache Commons VFS 指南

在 Ubuntu 22.04 上通过 Maven 依赖与官方二进制包两种方案安装 Apache Commons VFS 2.10.0,并用最小工程验证可用的完整实测指南

Apache Commons VFSApache Commons VFS2026/10/15

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

二、前置条件

安装开始前确认以下事项:

  1. 具备 root 权限(本文命令以 root 执行)。
  2. 服务器可访问互联网:需要访问 downloads.apache.org(官方包)与 repo1.maven.org(Maven 中央仓库)。
  3. 磁盘空间:openjdk-17-jdk 与 maven 安装约需 500 MB。
  4. 已安装 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 等远程文件。选型要点:

  1. 坐标名称:2.x 系列的 Maven 构件名是 commons-vfs2(groupId 为 org.apache.commons);1.x 的旧构件 commons-vfs:commons-vfs 已停止维护。
  2. Java 基线:2.10.0 主 jar 字节码版本为 major 52,即 Java 8 起可用,JDK 17 编译运行无兼容问题。
  3. 最新稳定版:截至 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 + zipfsJDK 内置本地、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-8JVM 默认字符集POSIX locale 服务器(platform encoding 为 ANSI_X3.4-1968)
-Dstdout.encoding=UTF-8System.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 完成卸载。

十一、参考链接