CentOS 8 安装 Apache Commons BeanUtils 指南
在 CentOS 8 从零安装 Commons BeanUtils 1.11.0:dnf 装 OpenJDK 17,Maven 模块流与二进制包双路,依赖与发行包双方案接入,含 sha512 校验、最小验证与卸载,命令与回显全部实测。
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.2 | downloads.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 安装命令即可。
十、参考链接
- Apache Commons BeanUtils 官方主页:https://commons.apache.org/proper/commons-beanutils/
- 官方下载目录(binaries 与 sha512):https://downloads.apache.org/commons/beanutils/
- Maven 中央仓库坐标页:https://repo.maven.apache.org/maven2/commons-beanutils/commons-beanutils/
- Apache Maven 下载页:https://maven.apache.org/download.cgi
- 官方用户指南:https://commons.apache.org/proper/commons-beanutils/userguide.html