CentOS 8 安装 Apache Commons VFS 指南

在 CentOS 8 上修复 EOL 后的 vault 镜像源并安装 JDK、Maven 与 Apache Commons VFS 2.10.0,覆盖 Maven 依赖与 bin 包两种方案的完整实测指南

Apache Commons VFSApache Commons VFS2026/10/15

CentOS 8 安装 Apache Commons VFS 指南

目标:在 CentOS 8 服务器上完成 Apache Commons VFS 2.10.0 的安装与最小可用验证,先处理 CentOS 8 停止维护后的软件源问题,再覆盖 Maven 依赖与官方 bin 包两种方案,已在 CentOS 8 实测通过。

一、环境信息

  • 操作系统:CentOS Linux release 8.4.2105
  • 架构:x86_64
  • JDK:OpenJDK 1.8.0_312(dnf 默认拉入)与 java-11-openjdk 11.0.13(显式安装)
  • 构建工具:Apache Maven 3.5.4(appstream 源 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(验证输出)

实测环境确认:

cat /etc/centos-release && uname -m

实测回显:

CentOS Linux release 8.4.2105
x86_64

二、前置条件

CentOS 8 已于 2021 年底停止维护(EOL),官方 mirrorlist.centos.org 已下线,安装任何软件前必须先把软件源切换到 vault 归档源。确认以下事项:

  1. 具备 root 权限(本文命令以 root 执行)。
  2. 可访问 vault 归档镜像与 Maven 中央仓库(repo1.maven.org、downloads.apache.org)。
  3. 磁盘空间:java-11-openjdk-devel 与 maven 安装约需 470 MB。
  4. 已安装 curl(最小化安装默认自带,本文实测输出 /usr/bin/curl)。

vault 归档源连通性实测:

curl -sI --max-time 20 https://mirrors.aliyun.com/centos-vault/8.4.2105/AppStream/x86_64/os/repodata/repomd.xml | head -1

实测回显:

HTTP/2 200

验证结果:阿里云 centos-vault 归档源可达,可替代已下线的官方源。

💡 技术拓展:CentOS 8 EOL 后的源选型对比

源地址形态特点
vault.centos.orghttp://vault.centos.org/8.4.2105/官方归档,部分网络环境不可直连
阿里云 centos-vaulthttps://mirrors.aliyun.com/centos-vault/8.4.2105/国内访问快,目录结构与官方 vault 一致
清华/中科大 centos-vault同上形态,域名不同与阿里云等价,就近选择

本文所用:阿里云 centos-vault。本文所有源地址均指向 8.4.2105 版本目录,与系统版本严格对应。

三、版本选型说明

Commons VFS 2.x 的 Maven 构件名为 commons-vfs2(groupId 为 org.apache.commons),2.10.0 为主 jar 字节码 major 52(Java 8 起可用),在 CentOS 8 自带的 JDK 8 上即可运行,无需强升 JDK。官网 2.x 系列当前仅保留 2.10.0 一个版本目录。

CentOS 8 各版本目录中 JDK 的实际供给情况(实测):

系统版本目录可用 JDK 包实测依据
8.4.2105java-11-openjdk-devel 1:11.0.13.0.8-1.el8_4dnf list 实测
8.4.2105java-17-openjdk-devel 无此包dnf list 实测为空
8.5.2111java-17-openjdk-devel 1:17.0.1.0.12-2.el8_5dnf list 实测

8.4.2105 的包清单实测:

dnf -q list java-11-openjdk-devel maven 2>&1 | tail -3

实测回显:

Available Packages
java-11-openjdk-devel.x86_64   1:11.0.13.0.8-1.el8_4                   appstream
maven.noarch                   1:3.5.4-5.module_el8.0.0+39+6a9b6e22    appstream

验证结果:8.4.2105 提供 JDK 11 与 Maven 3.5.4,不提供 JDK 17(JDK 17 自 8.5 起进入发行版)。

四、方案 A:Maven 依赖安装(在线,推荐)

4.1 修复软件源指向 vault

原始源文件指向已下线的 mirrorlist.centos.org,先注释 mirrorlist,再把 baseurl 指到阿里云 centos-vault:

sed -i -e 's|^mirrorlist=|#mirrorlist=|g' \
       -e 's|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/\$releasever|g' \
       /etc/yum.repos.d/CentOS-Linux-*.repo
grep '^baseurl' /etc/yum.repos.d/CentOS-Linux-AppStream.repo

实测回显:

baseurl=https://mirrors.aliyun.com/centos-vault/$releasever/AppStream/$basearch/os/

⚠️ 注意:vault 只保存具体版本目录(8.4.2105),不存在 8 目录。而系统变量 $releasever 的取值是 8,直接 makecache 会 404,必须把仓库文件中的 $releasever 明确替换为系统实际版本号:

sed -i 's|\$releasever|8.4.2105|g' /etc/yum.repos.d/CentOS-Linux-*.repo
grep '^baseurl' /etc/yum.repos.d/CentOS-Linux-AppStream.repo
dnf makecache 2>&1 | tail -4

实测回显:

baseurl=https://mirrors.aliyun.com/centos-vault/8.4.2105/AppStream/$basearch/os/
CentOS Linux 8.4.2105 - AppStream               2.8 MB/s | 9.6 MB     00:03
CentOS Linux 8.4.2105 - BaseOS                  3.7 MB/s | 8.5 MB     00:02
CentOS Linux 8.4.2105 - Extras                   13 kB/s |  10 kB     00:00
Metadata cache created.

验证结果:AppStream、BaseOS、Extras 三个仓库元数据全部拉取成功。

4.2 安装 JDK 与 Maven

dnf install -y java-11-openjdk-devel maven

实测回显(输出节选,实测首尾):

Installing:
Installing dependencies:
Installing weak dependencies:
Installed size: 472 M
Installed:

验证当前默认 java 与 mvn 绑定:

java -version
mvn -version | head -4

实测回显:

openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
---
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_312, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el8_4.x86_64/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968

验证结果:虽然显式装了 java-11-openjdk-devel,但 alternatives 默认项与 maven 依赖共同决定 java 命令解析到 1.8.0_312。Commons VFS 2.10.0 字节码基线是 Java 8,JDK 8 编译运行完全可用;若需要 JDK 11 运行,按 4.6 节切换。

4.3 创建工程并引入依赖

mkdir -p /root/vfs-demo/src/main/java

写入 /root/vfs-demo/pom.xml(注意 CentOS 8 默认 JDK 为 8,编译级别用 1.8):

<?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.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </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.source/target 设为 1.8:2.10.0 支持 Java 8 基线,默认 JDK 8 即可编译;若已按 4.6 节切到 JDK 11,此配置同样有效。
  • 固定 maven-compiler-plugin 3.11.0,避免 Maven 3.5.4 内置旧版插件按 Java 5 语法级别编译。

4.4 最小验证代码

写入 /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");
    }
}

4.5 编译与运行验证

cd /root/vfs-demo
mvn -q -B compile dependency:build-classpath -Dmdep.outputFile=/root/vfs-demo/cp.txt
ls target/classes/VfsCheck.class
cat cp.txt

实测回显:

target/classes/VfsCheck.class
/root/.m2/repository/org/apache/commons/commons-vfs2/2.10.0/commons-vfs2-2.10.0.jar:/root/.m2/repository/commons-logging/commons-logging/1.3.4/commons-logging-1.3.4.jar:/root/.m2/repository/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.jar:/root/.m2/repository/commons-io/commons-io/2.18.0/commons-io-2.18.0.jar

验证结果:编译成功;classpath 清单显示 commons-vfs2 2.10.0 自动带入 commons-logging 1.3.4、commons-lang3 3.17.0、commons-io 2.18.0 三个运行必需依赖。

运行验证程序:

java -Dfile.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

验证结果:JDK 8 下本地文件与 ram 内存文件读写全部正常,安装完成。

4.6 切换到 JDK 11(可选)

VFS 2.10.0 在 JDK 8 已可用;需要 JDK 11 时用 alternatives 切换默认 java/javac,并为 Maven 显式指定 JAVA_HOME:

alternatives --set java java-11-openjdk.x86_64
alternatives --set javac java-11-openjdk.x86_64
java -version
javac -version

实测回显:

openjdk version "11.0.13" 2021-10-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing)
javac 11.0.13

⚠️ 注意:切换 alternatives 后 mvn 仍绑定 1.8.0_312(实测输出 Java version: 1.8.0_312),因为 Maven 启动脚本优先读 JAVA_HOME 而它在此环境默认为空。显式导出后生效:

echo "JAVA_HOME 原值: [$JAVA_HOME]"
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
mvn -version | head -3

实测回显:

JAVA_HOME 原值: []
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 11.0.13, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-11-openjdk-11.0.13.0.8-1.el8_4.x86_64

用 JDK 11 重新构建并运行验证:

cd /root/vfs-demo
mvn -q -B clean compile dependency:build-classpath -Dmdep.outputFile=/root/vfs-demo/cp.txt
java -Dfile.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

验证结果:JDK 11 下重新构建与运行同样全部通过。将 export JAVA_HOME 写入 /etc/profile.d/java11.sh 可持久化。

五、方案 B:官方 bin 包 + jar 直跑(离线友好)

5.1 方案说明

使用官方 commons-vfs-2.10.0-bin.tar.gz 中的主 jar,加上 3 个运行必需依赖 jar,按 classpath 直接 javac/java。bin 包不含依赖 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:15 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/ | head -6

实测回显:

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

验证结果:主 jar commons-vfs2-2.10.0.jar 在解压目录内(与 Ubuntu 侧同一份发布包,内容一致)。

5.4 依赖 jar 下载与校验

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 全部一致。需要 tar/bz2 提供者时再补 commons-compress-1.27.1.jar(依赖 commons-codec-1.17.1.jar)。

5.5 编译与运行

cd /root/jar-run
mkdir -p out
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 -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

验证结果:JDK 8 纯 classpath 方式运行成功。

⚠️ 注意:JDK 8 的 javac 不会自动创建 -d 指定的输出目录,必须先 mkdir -p out,否则报错 directory not found: out。JDK 9 之后的 javac 才会自动建目录。

六、方案对比与选择建议

维度方案 A:Maven 依赖方案 B:bin 包 + jar 直跑
网络要求需访问中央仓库与 vault 源一次性下载 4 个 jar,之后可完全离线
依赖管理传递依赖自动解析手工维护 classpath 与校验
升级成本改 pom 版本号重建替换全部 jar 并重新校验
JDK 适配source/target 由 pom 决定由当前 java/javac 决定
适用场景常规开发与持续集成受限网络、单机工具

选择建议:能建 Maven 工程优先方案 A;离线交付用方案 B。两方案在 JDK 8 与 JDK 11 下实测结果一致。

七、配置说明

7.1 环境变量

CentOS 8 的 java/javac 由 alternatives 管理,Maven 绑定 JDK 需显式 JAVA_HOME(见 4.6 节实测)。持久化写法:

echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' > /etc/profile.d/vfs-java.sh
source /etc/profile.d/vfs-java.sh

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 运行期行为(提供者装配、缓存策略、FilesCache 实现等)由 StandardFileSystemManager 配置,与系统安装项无关,详见《Apache Commons VFS 2.10.0 配置参数详解》。

八、常见问题(FAQ)

8.1 dnf 报错 Failed to download metadata for repo appstream

原因:CentOS 8 EOL 后 mirrorlist.centos.org 已下线。解决:按 4.1 节把源切换到 vault 归档镜像。

8.2 源修复后仍报 404

原因:vault 目录按具体版本组织(8.4.2105),而仓库文件中的 $releasever 是 8,拼出 centos-vault/8/ 这种不存在的路径。解决:按 4.1 节把 $releasever 替换为实际版本号 8.4.2105(先 cat /etc/centos-release 确认本机版本)。

8.3 想用 JDK 17 怎么办

8.4.2105 目录不提供 java-17(实测 dnf list 为空)。两个选择:一是把仓库地址中的版本目录换成 8.5.2111,该目录实测提供 java-17-openjdk-devel(1:17.0.1.0.12-2.el8_5);二是保持 JDK 8/11,Commons VFS 2.10.0 在两者上均实测可用。

8.4 运行报 NoClassDefFoundError: org/apache/commons/logging/Log

原因:classpath 缺 commons-logging。方案 A 不会出现;方案 B 必须把 5.4 节 3 个依赖 jar 全部加入 -cp。

8.5 解析 tar 报 "relative path, and no base URI was provided"

原因:tar/tbz2/bz2 提供者是 if-available 条件注册,缺 commons-compress 时不安装。引入 commons-compress 即恢复;zip 与 ram 提供者无此条件,不受影响。

8.6 Maven 输出乱码或 Source option 5 报错

乱码:platform encoding 为 ANSI_X3.4-1968 时运行参数加 -Dfile.encoding=UTF-8。Source option 5:按 4.3 节固定 maven-compiler-plugin 3.11.0 并显式设置 source/target。

九、卸载与清理

清理验证工程与下载产物:

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

卸载 Maven 与 JDK:

dnf -y remove maven java-11-openjdk-devel
mvn --version
java -version

实测回显:

Removing:
Removing unused dependencies:
Complete!
---
bash: mvn: command not found
bash: java: command not found

验证结果:dnf 默认开启 clean_requirements_on_remove,移除 maven 与 java-11-openjdk-devel 时连带清理了仅被其依赖引入的 java-1.8.0-openjdk,mvn 与 java 命令均已不存在,卸载彻底。

十、参考链接