CentOS 8 安装 Apache Commons BeanUtils 指南

在 CentOS 8 从零安装 Commons BeanUtils 1.11.0:dnf 装 OpenJDK 17,Maven 模块流与二进制包双路,依赖与发行包双方案接入,含 sha512 校验、最小验证与卸载,命令与回显全部实测。

Apache Commons BeanUtilsApache Commons BeanUtils2026/10/13

CentOS 8 安装 Apache Commons BeanUtils 指南

目标:在 CentOS 8 服务器上从零搭建可编译、可运行 Apache Commons BeanUtils 的 Java 环境,覆盖「Maven 依赖」与「官方发行包手动安装」两种接入方案,并实测 dnf 模块流与二进制包两条 Maven 安装路径、sha512 校验、运行期依赖补齐、多版本管理与卸载,已在 CentOS Linux 8(OpenJDK 17.0.1、Maven 3.10.0)实测通过。

一、环境信息

本篇所有命令与回显均在以下环境中实测采集,复现时请保持相近版本:

  • 操作系统:CentOS Linux 8(AppStream/BaseOS 取自 8.5.2111 vault 仓库),x86_64,内核 6.8.0-138-generic
  • JDK:OpenJDK 17.0.1(java-17-openjdk-devel,dnf,另可装 OpenJDK 11/8 供多版本切换)
  • 构建工具:Apache Maven 3.10.0(官方二进制包);对照组 Maven 3.5.4(dnf 模块流 maven:3.5)
  • 组件版本:Apache Commons BeanUtils 1.11.0(downloads.apache.org 当前稳定线最新版,2026-10 实测)
  • 实验目录:/opt/lab/beanutils(方案 A 工程 proj,方案 B 目录 manual,发行包目录 dist)
  • 执行用户:root

二、版本选型

版本发布状态对 JDK 要求运行期依赖获取渠道
1.11.0稳定版(本篇实测采用)Java 8 及以上commons-logging 1.3.5、commons-collections 3.2.2downloads.apache.org 与 Maven 中央仓库
2.0.0-M2里程碑预览(新坐标 commons-beanutils2)以官方发布说明为准以其发行包内说明为准downloads.apache.org 的 binaries 目录

逐项说明:

  • 1.11.0:当前 1.x 稳定线最新版,Maven 中央仓库 maven-metadata.xml 的 <release> 与之一致;字节码为 Java 8(major version 52),在 8/11/17 均可运行。
  • 2.0.0-M2:新一代 commons-beanutils2 坐标的里程碑预览,坐标与包名均与 1.x 不同,本篇不采用。
  • 选型结论:生产环境统一使用 1.11.0。

先刷新元数据缓存,再确认 JDK 可用版本:

# dnf makecache | tail -3
CentOS Linux 8 - AppStream                       20 kB/s | 4.3 kB     00:00
CentOS Linux 8 - BaseOS                          19 kB/s | 3.9 kB     00:00
Metadata cache created.
# dnf -q list available java-17-openjdk-devel java-11-openjdk-devel
Available Packages
java-11-openjdk-devel.x86_64           1:11.0.13.0.8-4.el8_5           AppStream
java-17-openjdk-devel.x86_64           1:17.0.1.0.12-2.el8_5           AppStream

Metadata cache created. 说明仓库元数据正常;AppStream 中 17 与 11 的 devel 包都在,本篇选 17。

三、安装 JDK 与 Maven

3.1 安装 OpenJDK 17

# dnf install -y java-17-openjdk-devel curl wget tar
Package java-17-openjdk-devel-1:17.0.1.0.12-2.el8_5.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

本次实测机先前已装过该包,因此回显为 already installed;首次安装时 dnf 会列出 Installing 与 Installing dependencies 清单并以 Complete! 结束,判定标准相同:退出码 0 且最后出现 Complete!。顺带装入的 curl、wget、tar 供后续下载与解包使用。

验证 JDK:

# 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

3.2 安装 Maven:模块流与二进制包两条路

路线一(发行版模块流,版本固定)。先看仓库提供了哪些流:

# dnf module list | grep -iE "maven|Name"
Name                 Stream          Profiles                                 Summary
maven                3.5 [d]         common [d]                               Java project management and project comprehension tool
maven                3.6             common [d]                               Java project management and project comprehension tool

启用默认流并安装:

# dnf module enable -y maven
# dnf install -y maven
Complete!
# ls -l /usr/bin/mvn
lrwxrwxrwx 1 root root 21 /usr/bin/mvn -> /etc/alternatives/mvn
# /usr/bin/mvn -v | 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

两个实测发现要注意:其一,模块流只提供 3.5/3.6 老版本;其二,安装 maven 模块会连带拉入 java-1.8.0-openjdk,且安装后系统默认 java 被切换到 1.8(见 3.4 的处理)。

路线二(官方二进制包,版本新)。从 Apache 镜像取 3.10.0 并放入 /usr/local:

# mkdir -p /opt/lab/maven && cd /opt/lab/maven
# curl -sSO https://dlcdn.apache.org/maven/maven-3/3.10.0/binaries/apache-maven-3.10.0-bin.tar.gz
# tar -xzf apache-maven-3.10.0-bin.tar.gz
# ln -sf /opt/lab/maven/apache-maven-3.10.0/bin/mvn /usr/local/bin/mvn
# mvn -v
Apache Maven 3.10.0 (c43a36b8d67be7e0805a411bc0898af1a51f5472)
Maven home: /opt/lab/maven/apache-maven-3.10.0
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
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "6.8.0-138-generic", arch: "amd64", family: "unix"

路线二得到 3.10.0 且明确使用 JDK 17,本篇后续实测均基于它。注意 platform encoding: ANSI_X3.4-1968 提示当前 shell 无 UTF-8 locale,中文输出前需 export LANG=C.UTF-8(见 FAQ Q2)。

3.3 验证组件工具链

# mvn -v | head -1
Apache Maven 3.10.0 (c43a36b8d67be7e0805a411bc0898af1a51f5472)
# java -version | head -1
openjdk version "17.0.1" 2021-10-19 LTS
# javac -version
javac 17.0.1

三个可执行文件均能输出版本号,工具链完整。

3.4 多版本管理(可选)

用 alternatives 查看与切换系统默认 Java。装过 maven 模块的机器会多出 1.8 条目:

# alternatives --list | grep -E "^java|javac"
java                    auto    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre/bin/java
javac                   auto    /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/javac

java 当前 auto 指向 1.8,显式切回 17 并验证:

# alternatives --set java /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/java
# java -version | head -1
openjdk version "17.0.1" 2021-10-19 LTS

Commons BeanUtils 1.11.0 为 Java 8 字节码,1.8/11/17 均能运行;建议默认固定 17。

四、方案 A:Maven 依赖接入

4.1 创建工程骨架

# mkdir -p /opt/lab/beanutils/proj/src/main/java/com/example/beanutils
# cd /opt/lab/beanutils/proj

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>beanutils-lab</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>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>

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

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>3.1.0</version>
      </plugin>
    </plugins>
  </build>
</project>

逐项说明:

  • 业务依赖只有 commons-beanutils:1.11.0 一条,传递依赖交给 Maven 解析。
  • maven.compiler.source/target=17 与 3.1 安装的 JDK 匹配;project.build.sourceEncoding=UTF-8 保证中文源码与输出编码正确。
  • 两个插件显式固定版本,避免解析到仓库里过旧的插件版本。

4.2 核查依赖树并编译

# export LANG=C.UTF-8
# mvn dependency:tree 2>&1 | grep -E "\- commons|\+-|\\\\-|com.example:beanutils"
[INFO] com.example:beanutils-lab:jar:1.0.0
[INFO] \- commons-beanutils:commons-beanutils:jar:1.11.0:compile
[INFO]    +- commons-logging:commons-logging:jar:1.3.5:compile
[INFO]    \- commons-collections:commons-collections:jar:3.2.2:compile
# mvn -q compile

依赖树与官方声明一致;mvn -q compile 静默成功无输出、退出码 0。

五、方案 B:官方发行包手动接入

5.1 下载发行包并校验

# mkdir -p /opt/lab/beanutils/dist && cd /opt/lab/beanutils/dist
# curl -sSO https://downloads.apache.org/commons/beanutils/binaries/commons-beanutils-1.11.0-bin.tar.gz
# curl -sSO https://downloads.apache.org/commons/beanutils/binaries/commons-beanutils-1.11.0-bin.tar.gz.sha512
# cat commons-beanutils-1.11.0-bin.tar.gz.sha512
c1c0e71f526db64fc7aa9934f2910eedea5e575909edb3de39566e9a27b300e28826f6997b23338ef93dfee34d220077ba8669459640bddf5619ca0bb740d8ba
# sha512sum commons-beanutils-1.11.0-bin.tar.gz
c1c0e71f526db64fc7aa9934f2910eedea5e575909edb3de39566e9a27b300e28826f6997b23338ef93dfee34d220077ba8669459640bddf5619ca0bb740d8ba  commons-beanutils-1.11.0-bin.tar.gz

两段哈希逐字一致,校验通过。

5.2 解包与内容清点

# tar -xzf commons-beanutils-1.11.0-bin.tar.gz
# ls -l commons-beanutils-1.11.0/ | head -8
total 2724
-rw-r--r-- 1 root root   11359 May 25  2025 LICENSE.txt
-rw-r--r-- 1 root root     179 May 25  2025 NOTICE.txt
-rw-r--r-- 1 root root   21837 May 25  2025 RELEASE-NOTES.txt
drwxr-xr-x 7 root root    4096 May 25  2025 apidocs
-rw-r--r-- 1 root root 1449634 May 25  2025 commons-beanutils-1.11.0-javadoc.jar
-rw-r--r-- 1 root root  303875 May 25  2025 commons-beanutils-1.11.0-sources.jar
-rw-r--r-- 1 root root  298782 May 25  2025 commons-beanutils-1.11.0-test-sources.jar

与 Ubuntu 一致:发行包没有 lib/ 目录,主 jar 之外的两个运行期依赖必须从中央仓库单独获取。

5.3 补齐运行期依赖

# mkdir -p /opt/lab/beanutils/manual/lib && cd /opt/lab/beanutils/manual
# cp /opt/lab/beanutils/dist/commons-beanutils-1.11.0/commons-beanutils-1.11.0.jar lib/
# curl -sSO https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.3.5/commons-logging-1.3.5.jar
# curl -sSO https://repo.maven.apache.org/maven2/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar
# mv commons-logging-1.3.5.jar commons-collections-3.2.2.jar lib/
# ls -l lib/
total 896
-rw-r--r-- 1 root root 246806 commons-beanutils-1.11.0.jar
-rw-r--r-- 1 root root 588337 commons-collections-3.2.2.jar
-rw-r--r-- 1 root root  73737 commons-logging-1.3.5.jar

5.4 编译与运行

# cp -r /opt/lab/beanutils/proj/src .
# javac -encoding UTF-8 -cp lib/commons-beanutils-1.11.0.jar -d out $(find src -name "*.java")

先复现缺依赖报错,再给出正确运行:

# java -cp out:lib/commons-beanutils-1.11.0.jar com.example.beanutils.MapBeanDemo
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
        at org.apache.commons.beanutils.ConvertUtilsBean.<init>(ConvertUtilsBean.java:154)
        at org.apache.commons.beanutils.BeanUtilsBean.<init>(BeanUtilsBean.java:113)
# java -cp out:lib/commons-beanutils-1.11.0.jar:lib/commons-logging-1.3.5.jar:lib/commons-collections-3.2.2.jar com.example.beanutils.MapBeanDemo
describe 过滤后 = {empName=周八, age=35}
populate 后 empName = 吴九
populate 后 age = 41 (类型 java.lang.Integer)

三个 jar 齐备后运行正常,方案 B 验证通过。

六、方案对比与选型建议

维度方案 A:Maven 依赖方案 B:发行包手动安装
依赖管理依赖树自动解析并可核查手动补 logging/collections 两个 jar
Maven 获取模块流 3.5/3.6 或二进制包 3.10.0不依赖 Maven,仅需 JDK
版本升级改 pom 版本号重新下载并核对 sha512
离线友好需预置本地仓库天然离线
典型故障插件版本漂移漏 jar 即 NoClassDefFoundError

选型建议:目标机可用 Maven 就选方案 A 并用二进制包装 3.10.0(模块流版本过旧且会拉动默认 JDK);完全离线或极简环境用方案 B,牢记三 jar 齐备。

七、最小验证

以「嵌套属性读写」作为安装验收代码,NestedDemo.java 全文:

package com.example.beanutils;

import org.apache.commons.beanutils.PropertyUtils;

/** 示例:PropertyUtils 跨层级嵌套属性读写 */
public class NestedDemo {
    public static void main(String[] args) throws Exception {
        Model.Employee emp = new Model.Employee();
        emp.setEmpName("张三");
        emp.setAge(30);

        String deptName = (String) PropertyUtils.getProperty(emp, "dept.deptName");
        String mgrName = (String) PropertyUtils.getProperty(emp, "dept.manager.name");
        System.out.println("读 dept.deptName = " + deptName);
        System.out.println("读 dept.manager.name = " + mgrName);

        PropertyUtils.setProperty(emp, "dept.deptName", "平台架构部");
        PropertyUtils.setProperty(emp, "dept.manager.name", "李四");
        PropertyUtils.setProperty(emp, "dept.manager.title", "高级经理");

        System.out.println("写后读 dept.deptName = " + PropertyUtils.getProperty(emp, "dept.deptName"));
        System.out.println("写后读 dept.manager.title = " + PropertyUtils.getProperty(emp, "dept.manager.title"));
        System.out.println("整对象核对 = " + emp.getDept().getManager().getName() + " @ " + emp.getDept().getDeptName());
    }
}

Maven 方案运行:

# export LANG=C.UTF-8
# cd /opt/lab/beanutils/proj
# mvn -q compile exec:java -Dexec.mainClass=com.example.beanutils.NestedDemo
读 dept.deptName = null
读 dept.manager.name = null
写后读 dept.deptName = 平台架构部
写后读 dept.manager.title = 高级经理
整对象核对 = 李四 @ 平台架构部

空嵌套字段读出 null 不抛异常,写入后核对行全部正确,验证通过。

八、FAQ

Q1:手动运行报 NoClassDefFoundError: org/apache/commons/logging/LogFactory?

BeanUtils 初始化即依赖 commons-logging,只把主 jar 放进 -cp 必然报错。解法是把 commons-logging-1.3.5.jar、commons-collections-3.2.2.jar 与主 jar 一起放进 -cp(见 5.4 两条命令的对照回显)。

Q2:中文输出全是问号?

CentOS 8 最小安装默认 locale 为 C,JVM 平台编码为 ANSI_X3.4-1968。实测在命令前加 export LANG=C.UTF-8 后中文输出正常;这是可复现的系统级现象,建议写进部署脚本的公共前缀。

Q3:安装 maven 模块后系统默认 java 变成了 1.8?

实测 dnf install -y maven(模块流 3.5)会连带安装 java-1.8.0-openjdk,并把 alternatives 的 java 条目切到 1.8。处理:alternatives --set java /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/java 显式切回,随后 java -version 确认为 17.0.1。

Q4:离线环境怎么拿依赖?

在有外网的机器按 5.3 的三个 URL 下载 jar 与发行包,用 sha512 核对后拷贝到目标机即可;校验值以官方 .sha512 文件为准,不要凭记忆手抄。

九、卸载

清理实验目录与本地仓库缓存:

# rm -rf /opt/lab/beanutils/proj /opt/lab/beanutils/dist /opt/lab/beanutils/manual
# rm -rf ~/.m2/repository/commons-beanutils

卸载二进制包版 Maven(移除软链与目录):

# rm -f /usr/local/bin/mvn
# rm -rf /opt/lab/maven/apache-maven-3.10.0
# mvn -v
bash: mvn: command not found

卸载模块流 Maven 与 JDK,并验证:

# dnf remove -y maven 2>&1 | tail -2
Complete!
# dnf remove -y java-17-openjdk-devel 2>&1 | tail -4
  java-17-openjdk-headless-1:17.0.1.0.12-2.el8_5.x86_64
  json-glib-1.4.4-1.el8.x86_64
  libwayland-client-1.19.0-1.el8.x86_64
Complete!
# java -version 2>&1 | head -1
openjdk version "17.0.1" 2021-10-19 LTS

如需恢复环境,按第三章顺序反向执行 dnf install -y java-17-openjdk-devel curl wget tar 与 Maven 安装命令即可。

十、参考链接

  1. Apache Commons BeanUtils 官方主页:https://commons.apache.org/proper/commons-beanutils/
  2. 官方下载目录(binaries 与 sha512):https://downloads.apache.org/commons/beanutils/
  3. Maven 中央仓库坐标页:https://repo.maven.apache.org/maven2/commons-beanutils/commons-beanutils/
  4. Apache Maven 下载页:https://maven.apache.org/download.cgi
  5. 官方用户指南:https://commons.apache.org/proper/commons-beanutils/userguide.html