CentOS 8 安装 Apache Commons Validator 指南

在 CentOS 8 上修复 EOL 仓库、通过 dnf 安装 OpenJDK 17 与 Maven 并以两种方式落地 Apache Commons Validator 1.11.0 的实操指南

Apache Commons ValidatorApache Commons Validator2026/10/15

CentOS 8 安装 Apache Commons Validator 指南

目标:在 CentOS 8 服务器上修复已停止维护(EOL)的 yum/dnf 仓库,安装 OpenJDK 17 与 Maven,并以 Maven 依赖、官方二进制包两种方式完成 Apache Commons Validator 1.11.0 的最小验证,已在 CentOS 8(x86_64)+ OpenJDK 17.0.1 环境实测通过。

一、环境信息

  • 操作系统:CentOS Linux release 8(核心仓库快照对应 8.5.2111 vault 版本)
  • 架构:x86_64
  • JDK:java-17-openjdk 17.0.1.0.12-2.el8_5(dnf 安装)
  • 构建工具:Apache Maven 3.5.4(Red Hat 3.5.4-5,dnf 安装)
  • 组件版本:Apache Commons Validator 1.11.0(2026-07-31 发布,1.x 系列最新稳定版)
  • Maven 坐标:commons-validator:commons-validator:1.11.0
  • 工作目录:/work(示例工程位于 /work/hellocheck,二进制包解压于 /work/commons-validator-1.11.0)

二、前置条件

  • 一台 CentOS 8 服务器,具备 root 权限;
  • 服务器可访问外网 HTTP 服务(用于系统仓库与组件下载);
  • 磁盘剩余空间不少于 1 GB;
  • 了解 dnf 包管理基本操作。

三、版本选型说明

3.1 组件版本:1.11.0

与 Ubuntu 指南一致,官方发布目录中当前 1.x 系列最新稳定版为 1.11.0(2026-07-31 发布):

$ curl -s https://downloads.apache.org/commons/validator/binaries/
commons-validator-1.11.0-bin.tar.gz        2026-07-31 12:15  2.8M
commons-validator-1.11.0-bin.tar.gz.asc    2026-07-31 12:15  265
commons-validator-1.11.0-bin.tar.gz.sha512 2026-07-31 12:15  129
commons-validator-1.11.0-bin.zip           2026-07-31 12:15  3.2M
commons-validator-1.11.0-bin.zip.asc       2026-07-31 12:15  265
commons-validator-1.11.0-bin.zip.sha512    2026-07-31 12:15  129

官方 RELEASE-NOTES 明确 Java 8 or later is required,因此 JDK 17 可直接运行。

💡 技术拓展:运行时选型——JDK 8/11/17 均满足 1.11.0 要求。CentOS 8 的 AppStream 仓库同时提供 java-1.8.0-openjdk、java-11-openjdk 与 java-17-openjdk,本文选择 JDK 17(LTS、与 Ubuntu 指南保持一致);CentOS 8 的 Maven 为 3.5.4(较 Ubuntu 的 3.6.3 略旧,构建本工程没有兼容性问题)。本文所用组合为 1.11.0 + OpenJDK 17.0.1 + Maven 3.5.4。

3.2 Maven 坐标

groupId 为 commons-validator(不是 org.apache.commons,这是 Commons Validator 的特例):

<dependency>
  <groupId>commons-validator</groupId>
  <artifactId>commons-validator</artifactId>
  <version>1.11.0</version>
</dependency>

该坐标自动带入 commons-beanutils 1.11.0、commons-digester 2.1、commons-logging 1.4.0、commons-collections 3.2.2 四个编译期依赖。

3.3 安装方案总览

方案依赖获取方式需要安装的系统组件适用场景
方案 AMaven 中央仓库java-17-openjdk-devel、maven日常开发与持续集成,推荐
方案 B官方 bin 二进制包java-17-openjdk-devel无法直连 Maven 仓库、仅需运行环境

四、修复 EOL 仓库(必做)

CentOS 8 已于 2021 年底停止维护,官方 mirror.centos.org 已下线,仓库文件中的 mirrorlist 全部失效,直接 dnf makecache 会失败。第一步必须把仓库指向 vault 归档。

实测发现一个重要事实:vault.centos.org 官方域名在部分网络环境下会被其 CloudFront 边缘节点直接拒绝(HTTP 403):

$ curl -sI https://vault.centos.org/8.5.2111/AppStream/x86_64/os/repodata/repomd.xml | head -1
HTTP/2 403

因此本文改用社区 vault 镜像(以阿里云镜像站为例),将 8.x 系列最后一个点版本 8.5.2111 写入仓库文件:

# sed -i -e 's|mirrorlist=|#mirrorlist=|g' \
         -e 's|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com/centos-vault|g' \
         -e 's|$releasever|8.5.2111|g' /etc/yum.repos.d/CentOS-*.repo
# dnf clean all
# dnf makecache

输出节选(实测末尾):

CentOS Linux 8.5.2111 - AppStream               3.3 MB/s | 8.4 MB     00:02
CentOS Linux 8.5.2111 - BaseOS                  5.7 MB/s | 4.6 MB     00:00
CentOS Linux 8.5.2111 - Extras                   12 kB/s |  10 kB     00:00
Metadata cache created.

要点提示:Metadata cache created. 说明 BaseOS、AppStream、Extras 三个核心仓库全部可用;若你们网络访问阿里云镜像也不通畅,可将 https://mirrors.aliyun.com/centos-vault 换成任一可用的 centos-vault 镜像地址,路径结构相同。

五、安装方案 A:dnf 安装 JDK 17 与 Maven,通过 Maven 依赖使用

5.1 查询并安装

先确认仓库中可用的版本:

# dnf list --available 'java-17-openjdk*'
Available Packages
java-17-openjdk.x86_64                    1:17.0.1.0.12-2.el8_5        appstream
java-17-openjdk-demo.x86_64               1:17.0.1.0.12-2.el8_5        appstream
java-17-openjdk-devel.x86_64              1:17.0.1.0.12-2.el8_5        appstream
java-17-openjdk-headless.x86_64           1:17.0.1.0.12-2.el8_5        appstream

# dnf list --available maven
Available Packages
maven.noarch           1:3.5.4-5.module_el8.0.0+39+6a9b6e22            appstream

安装编译版 JDK 与 Maven:

# dnf install -y java-17-openjdk-devel maven

输出节选(实测末尾):

  ttmkfdir-3.0.9-54.el8.x86_64
  tzdata-java-2021e-1.el8.noarch
  which-2.21-16.el8.x86_64
  xkeyboard-config-2.28-1.el8.noarch
  xorg-x11-font-utils-1:7.5-41.el8.x86_64
  xorg-x11-fonts-Type1-7.5-19.el8.noarch

Complete!

5.2 切换默认 JDK 并验证

实测关键点:安装 maven 会连带装入 java-1.8.0-openjdk 并把默认 java 指向 1.8,必须用 alternatives 显式切换:

# java -version
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)

# alternatives --set java /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/java
# alternatives --set javac /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/javac
# java -version
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment 21.9 (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM 21.9 (build 17.0.1+12-LTS, mixed mode, sharing)
# javac -version
javac 17.0.1

Maven 自身按 JAVA_HOME 选择 JDK,即使默认 java 已切到 17,mvn -version 仍显示 1.8,需要显式设置:

# mvn -version | head -3
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-2.el8_5.x86_64/jre

# export JAVA_HOME=/usr/lib/jvm/java-17
# mvn -version | head -3
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 17.0.1, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64

要点提示:把 export JAVA_HOME=/usr/lib/jvm/java-17 写入 /etc/profile.d/java17.sh 或 ~/.bash_profile 可长期生效。

5.3 创建最小验证工程

与 Ubuntu 指南相同,创建 /work/hellocheck 工程。

/work/hellocheck/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>com.example</groupId>
  <artifactId>hellocheck</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>commons-validator</groupId>
      <artifactId>commons-validator</artifactId>
      <version>1.11.0</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>hellocheck</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.5.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals><goal>shade</goal></goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>HelloValidator</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

/work/hellocheck/src/main/java/HelloValidator.java:

import org.apache.commons.validator.routines.EmailValidator;
import org.apache.commons.validator.routines.InetAddressValidator;
import org.apache.commons.validator.routines.checkdigit.LuhnCheckDigit;

public class HelloValidator {
    public static void main(String[] args) {
        System.out.println("EmailValidator.isValid(user@example.com) = "
                + EmailValidator.getInstance().isValid("user@example.com"));
        System.out.println("EmailValidator.isValid(bad@@example.com) = "
                + EmailValidator.getInstance().isValid("bad@@example.com"));
        System.out.println("InetAddressValidator.isValidInet4Address(192.168.1.10) = "
                + InetAddressValidator.getInstance().isValidInet4Address("192.168.1.10"));
        System.out.println("InetAddressValidator.isValidInet6Address(2001:db8::1) = "
                + InetAddressValidator.getInstance().isValidInet6Address("2001:db8::1"));
        System.out.println("LuhnCheckDigit.isValid(4417123456789113) = "
                + LuhnCheckDigit.LUHN_CHECK_DIGIT.isValid("4417123456789113"));
    }
}

5.4 构建并运行

# cd /work/hellocheck && mvn -B package

输出节选(实测末尾):

[WARNING] mvn dependency:tree -Ddetail=true and the above output.
[WARNING] See https://maven.apache.org/plugins/maven-shade-plugin/
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing /work/hellocheck/target/hellocheck.jar with /work/hellocheck/target/hellocheck-1.0.0-shaded.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  05:25 min
[INFO] Finished at: 2026-10-15T01:30:27Z
[INFO] ------------------------------------------------------------------------

首次构建 5 分 25 秒(依赖与插件下载为主),与 Ubuntu 指南的 5 分 24 秒基本一致,说明构建时间由网络决定而非系统发行版。

# java -jar /work/hellocheck/target/hellocheck.jar
EmailValidator.isValid(user@example.com) = true
EmailValidator.isValid(bad@@example.com) = false
InetAddressValidator.isValidInet4Address(192.168.1.10) = true
InetAddressValidator.isValidInet6Address(2001:db8::1) = true
LuhnCheckDigit.isValid(4417123456789113) = true

验证结果:五项校验全部符合预期,方案 A 在 CentOS 8 上落地完成。

六、安装方案 B:官方二进制包 + javac/java 直跑

6.1 下载并校验

# cd /work
# curl -sO https://downloads.apache.org/commons/validator/binaries/commons-validator-1.11.0-bin.tar.gz
# curl -sO https://downloads.apache.org/commons/validator/binaries/commons-validator-1.11.0-bin.tar.gz.sha512
# ls -l commons-validator-1.11.0-bin.tar.gz
-rw-r--r-- 1 root root 2948421 Oct 15 01:29 commons-validator-1.11.0-bin.tar.gz

官方 .sha512 为裸哈希(仅一行 128 位十六进制),直接校验会报 no properly formatted SHA512 checksum lines found,拼接文件名列后再校验:

# echo 'de5b755fe96916208bf38d608940d1a258c01964b21e72fae4cd892c8a3f8cb9699778857d59492cccbe985fe7b068c0968ece5777927812fd9cd4d13da2fa4c  commons-validator-1.11.0-bin.tar.gz' > check-fixed.sha512
# sha512sum -c check-fixed.sha512
commons-validator-1.11.0-bin.tar.gz: OK

6.2 解压与编译运行

# tar xzf commons-validator-1.11.0-bin.tar.gz
# ls commons-validator-1.11.0/
LICENSE.txt
NOTICE.txt
README.md
RELEASE-NOTES.txt
apidocs
commons-validator-1.11.0-javadoc.jar
commons-validator-1.11.0-sources.jar
commons-validator-1.11.0-test-sources.jar
commons-validator-1.11.0-tests.jar
commons-validator-1.11.0.jar

将 5.3 节的 HelloValidator.java 拷入解压目录:

# cd /work/commons-validator-1.11.0
# javac -cp commons-validator-1.11.0.jar HelloValidator.java
# java -cp .:commons-validator-1.11.0.jar HelloValidator
EmailValidator.isValid(user@example.com) = true
EmailValidator.isValid(bad@@example.com) = false
InetAddressValidator.isValidInet4Address(192.168.1.10) = true
InetAddressValidator.isValidInet6Address(2001:db8::1) = true
LuhnCheckDigit.isValid(4417123456789113) = true

验证结果:方案 B 全程无需 Maven。EmailValidator、InetAddressValidator、LuhnCheckDigit 等现代校验器(routines 包)只需主 jar;旧式 XML 规则配置方式需要额外将 commons-beanutils、commons-digester、commons-logging、commons-collections 四个 jar 加入 classpath。

七、方案对比与选择建议

对比项方案 A(Maven 依赖)方案 B(官方 bin 包)
依赖管理自动带入 4 个传递依赖XML 方式需手工备齐 4 个 jar
JDK 管理需处理 alternatives + JAVA_HOME 双处切换同样需要 alternatives 切换
首次成本仓库修复 + 装包约 3~5 分钟,构建 5 分钟量级下载 2.8 MB,秒级
可复现性坐标锁定,CI 友好自管 jar 与校验文件
适用对象应用开发团队(推荐)离线/内网机器、最小化验证

选择建议:CentOS 8 上方案 A 的主要门槛是 EOL 仓库修复(第四节,一次性工作)与默认 JDK 切换(5.2 节);跨过这两个门槛后,日常维护体验与 Ubuntu 无差异。方案 B 适合作为兜底。

八、配置说明

  • 组件本身无运行时配置文件,行为全部由代码开关控制,详见本专栏《Apache Commons Validator 1.11.0 配置参数详解》。
  • JDK 管理三件套:alternatives --set java(命令行运行时)、alternatives --set javac(编译器)、JAVA_HOME(Maven 及多数中间件读取),三处需一致,完整切换命令见第五节。
  • 编码:实测 mvn -version 显示 platform encoding: ANSI_X3.4-1968,处理中文时建议 export LANG=C.UTF-8 或命令行加 -Dfile.encoding=UTF-8。
  • Maven 3.5.4 与 3.11.0 版 compiler/shade 插件兼容,无需额外配置;若公司仓库限制插件版本,可用 -Dmaven.compiler.plugin.version 类自定义属性调整。

九、常见问题(FAQ)

1. dnf makecache 报 Status code: 403 for https://vault.centos.org/8.5.2111/AppStream/x86_64/os/repodata/repomd.xml。 官方 vault 域名在部分网络被 CloudFront 拦截(本文实测遇到),换成社区 vault 镜像即可,见第四节;注意 baseurl 中 $releasever 需一并替换为 8.5.2111。

2. 忘了修仓库直接装包,报 Failed to download metadata for repo 'appstream'。 先执行第四节的 sed 与 dnf makecache,再安装软件包。

3. mvn package 报 invalid target release: 17。 Maven 仍在用 JDK 8:检查 mvn -version 的 Java version 行,按 5.2 节设置 JAVA_HOME 并重新执行。

4. java -version 与 javac -version 版本不一致。 alternatives 的 java 与 javac 是两个独立条目,需要分别 --set(5.2 节两条命令)。

5. sha512sum -c 报格式错误。 官方 .sha512 为裸哈希,自行拼成 哈希 文件名 格式(6.1 节)。

6. 运行 XML 规则配置程序抛 NoClassDefFoundError: org/apache/commons/digester/Digester。 为 classpath 补上 commons-beanutils、commons-digester、commons-logging、commons-collections 四个 jar,或改用方案 A 由 Maven 自动带入。

7. 是否可以直接用 CentOS Stream 9/RHEL 9 替代? 可以,新系统仓库无需修复,且自带更新的 JDK;但 CentOS 8 存量机器仍需按本文流程操作。

十、卸载与清理

# rm -rf /work/hellocheck /work/commons-validator-1.11.0 /work/commons-validator-1.11.0-bin.tar.gz /work/check-fixed.sha512
# dnf remove -y maven java-17-openjdk-devel java-1.8.0-openjdk java-1.8.0-openjdk-headless
# dnf autoremove -y
# rm -rf ~/.m2

输出节选(实测末尾):

Removed:
  maven-1:3.5.4-5.module_el8.0.0+39+6a9b6e22.noarch
  java-17-openjdk-devel-1:17.0.1.0.12-2.el8_5.x86_64

Complete!

执行后 java、javac、mvn 均不再可用,仓库文件如需恢复可用状态,将 /etc/yum.repos.d/CentOS-*.repo 中的 baseurl 指向其他可用镜像或重装 centos-linux-release 包覆盖即可。

十一、参考链接