CentOS 8 安装 Apache Commons Pool 指南
在 CentOS 8 上安装 Apache Commons Pool 2.13.1,重点解决 EOL 后软件源失效问题(切换 vault 镜像)、dnf 安装 JDK 17 与 Maven、默认 JDK 切换与 JAVA_HOME 绑定,全部命令实测通过。
CentOS 8 安装 Apache Commons Pool 指南
目标:在 CentOS 8 上从零搭建 Apache Commons Pool 2.13.1 的开发与运行环境(JDK 17 + Maven 3.5.4 + 官方依赖),重点解决 CentOS 8 停止维护(EOL)后软件源失效、默认 JDK 停在 1.8、Maven 绑错 JDK 三类问题;本文全部命令与回显均已在 CentOS 8 实测通过。
Apache Commons Pool 是 Apache Commons 项目下的对象池化框架,提供 GenericObjectPool(通用对象池)与 GenericKeyedObjectPool(按键分池)两类实现,把「昂贵对象的创建—复用—回收」统一托管。它是纯 Java 库,没有独立进程与常驻服务,安装本质是「修复可用软件源 → 装 JDK/构建工具 → 引入依赖 → 写最小验证代码 → 编译运行」。本文选用 2.x 主线版本 2.13.1(包名 org.apache.commons.pool2,Maven 坐标 org.apache.commons:commons-pool2),并覆盖 Maven 依赖与官方 bin 包 + jar 直跑两种方案。
⚠️ 重要:CentOS 8 已于 2021-12-31 停止维护(EOL),官方镜像域名
mirrorlist.centos.org已停止解析,历史归档迁至 vault 归档站。因此本文比 Ubuntu 场景多出「修复软件源」一章,且仓库内 JDK 17 冻结在 17.0.1(见第四章选型说明)。
一、环境信息
本节固定可复现基线。CentOS 8 场景下的软件源走阿里云 centos-vault 归档镜像,JDK 与 Maven 均来自该仓库。
- 操作系统:CentOS Linux 8(归档版本 8.5.2111,EOL 前最后一个点版本)
- 架构:x86_64
- 软件源:阿里云 centos-vault 镜像(
https://mirrors.aliyun.com/centos-vault/8.5.2111/) - JDK:java-17-openjdk-devel 1:17.0.1.0.12-2.el8_5(即 OpenJDK 17.0.1)
- 构建工具:Apache Maven 1:3.5.4-5.module_el8.0.0+39+6a9b6e22
- 组件版本:commons-pool2 2.13.1
- 官方下载目录:
https://downloads.apache.org/commons/pool/ - Maven 坐标:
org.apache.commons:commons-pool2:2.13.1 - 验证用工作目录:
/root/commons-pool-demo(Maven 工程)、/root/jar-run(jar 直跑)
系统确认(实时回显):
cat /etc/os-release | head -3
NAME="CentOS Linux"
VERSION="8"
ID="centos"
uname -m
x86_64
💡 说明:Commons Pool 是库而非服务,环境中不存在需要常驻的守护进程;「安装完成」的判定标准是可编译并运行一个调用其 API 的最小程序,而不是某个端口处于监听状态。
二、前置条件
本节说明安装前必须满足的条件。CentOS 8 场景的关键前置是「一个可用的软件源」,这需要先做可达性探测(第三章完成切换)。
- 具有 root 权限的 CentOS 8 系统。
- 能解析并访问阿里云镜像站
mirrors.aliyun.com。 - 能访问 Apache 官方下载站
downloads.apache.org与 Maven 中央仓库repo1.maven.org。 - 至少 2 GB 可用磁盘空间(本方案安装 JDK + Maven 及依赖合计约 134 MB 下载量)。
三个源的连通性探测(实时回显,是第三章操作依据):
getent hosts mirrorlist.centos.org; echo EXIT=$?
EXIT=2
curl -s -o /dev/null -w "%{http_code}\n" --max-time 15 https://vault.centos.org/centos/8/BaseOS/x86_64/os/repodata/repomd.xml
403
curl -s -o /dev/null -w "%{http_code}\n" --max-time 15 https://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/x86_64/os/repodata/repomd.xml
200
结果解读:mirrorlist.centos.org 域名已无法解析(getent 退出码 2),官方归档站 vault.centos.org 在部分网络下返回 403,阿里云 centos-vault 镜像返回 200 可用。
三、修复软件源(CentOS 8 必做)
本节是 CentOS 8 特有的必做步骤:原始源依赖已停止解析的 mirrorlist 服务,直接 dnf makecache 会失败,需切换到归档镜像。
3.1 失败现象与原因
未修复前执行 dnf makecache,dnf 先请求 mirrorlist.centos.org 获取镜像列表,该域名已停止解析,实测报 Curl error (6)(无法解析主机名)并中断,BaseOS、AppStream、Extras 三个源全部失败。原因:CentOS 8 EOL 后官方下线了 mirrorlist 服务,历史包仅保留在归档站。
3.2 切换到 vault 归档镜像
两步完成:第一步注释全部 mirrorlist 行并启用 baseurl;第二步把 baseurl 指向实测可达的阿里云 centos-vault 镜像(官方 vault 地址 vault.centos.org 在本环境实测 403,见第二章探测)。
sed -i -e 's|mirrorlist=|#mirrorlist=|g' -e 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*.repo
sed -i 's|^baseurl=http://vault.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111|' /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-AppStream.repo /etc/yum.repos.d/CentOS-Linux-Extras.repo
核对三个主源的最终 baseurl(实时回显):
grep -E "^baseurl" /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-AppStream.repo /etc/yum.repos.d/CentOS-Linux-Extras.repo
/etc/yum.repos.d/CentOS-Linux-BaseOS.repo:baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/x86_64/os/
/etc/yum.repos.d/CentOS-Linux-AppStream.repo:baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/AppStream/x86_64/os/
/etc/yum.repos.d/CentOS-Linux-Extras.repo:baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/extras/x86_64/os/
3.3 刷新缓存并确认源恢复
dnf makecache
# 输出节选(实测尾部)
CentOS Linux 8 - AppStream 2.3 MB/s | 8.4 MB 00:03
CentOS Linux 8 - BaseOS 3.8 MB/s | 4.6 MB 00:01
CentOS Linux 8 - Extras 15 kB/s | 10 kB 00:00
Metadata cache created.
验证点:三个源全部拉取成功且出现 Metadata cache created.,说明软件源已修复,后续 dnf 操作可以正常进行。
四、版本选型说明
本节确认 Commons Pool 的目标版本。官方 binaries 目录当前提供 2.13.1 与 2.6.2 两个版本线的安装包(在 CentOS 服务器上实测回显,与第三章同一台机器执行):
curl -s --max-time 30 https://downloads.apache.org/commons/pool/binaries/ | grep -oE "href=\"[^\"]+\"" | grep -vE "href=\"(http|#|\?|/commons)"
href="commons-pool2-2.13.1-bin.tar.gz"
href="commons-pool2-2.13.1-bin.tar.gz.asc"
href="commons-pool2-2.13.1-bin.tar.gz.sha512"
href="commons-pool2-2.13.1-bin.zip"
href="commons-pool2-2.13.1-bin.zip.asc"
href="commons-pool2-2.13.1-bin.zip.sha512"
href="commons-pool2-2.6.2-bin.tar.gz"
href="commons-pool2-2.6.2-bin.tar.gz.asc"
href="commons-pool2-2.6.2-bin.tar.gz.sha512"
href="commons-pool2-2.6.2-bin.zip"
href="commons-pool2-2.6.2-bin.zip.asc"
href="commons-pool2-2.6.2-bin.zip.sha512"
Maven 中央仓库元数据确认最新发布版(实时回显):
curl -s --max-time 30 https://repo1.maven.org/maven2/org/apache/commons/commons-pool2/maven-metadata.xml | grep -E "<latest>|<release>"
<latest>2.13.1</latest>
<release>2.13.1</release>
官方 RELEASE-NOTES 对 JDK 基线的声明(实时回显):
curl -s --max-time 30 https://downloads.apache.org/commons/pool/RELEASE-NOTES.txt | sed -n "11,13p"
Versions 2.7.x and up require Java 8 or later.
Version 2.6.x requires Java 7 or above.
| 版本线 | 最新版 | JDK 基线 | 包名/坐标 | 适用场景 |
|---|---|---|---|---|
| 2.x(当前主线) | 2.13.1 | Java 8+ | org.apache.commons.pool2 / org.apache.commons:commons-pool2 | 所有新项目默认选择 |
| 2.6.x(旧 2.x 线) | 2.6.2 | Java 7+ | 同上 | 需兼容 Java 7 的遗留工程 |
| 1.x(已停止维护) | 1.6 | Java 5+ | org.apache.commons.pool / commons-pool:commons-pool | 极老项目兼容,不建议新用 |
关键差异与选型:2.x 相比 1.x 重写了整个池化实现,补齐了实例追踪(PooledObject 状态机)、池监控(JMX MBean)与驱逐策略(EvictionPolicy)三大能力。本文实际采用 2.13.1,它是 Maven 中央仓库当前 latest/release 版本,实测在 JDK 17.0.1 上编译运行无告警。
💡 技术拓展:Java 生态里做「对象池化」的常见方案对比如下——
方案 定位 特点 适用场景 Commons Pool 2.x 通用对象池框架 工厂钩子 + 驱逐 + JMX 全齐,语言无关 数据库外的各类昂贵对象(连接、会话、缓冲区、解析器) Commons Pool 1.x 上一代实现 无 PooledObject状态机,性能弱于 2.x仅维护遗留系统 Commons DBCP2 JDBC 连接池 构建在 Commons Pool 2 之上 纯 JDBC 场景 HikariCP JDBC 连接池 自研无锁结构,不依赖 Commons Pool 追求极致吞吐的 JDBC 场景 本文采用 Commons Pool 2.x,理由是它提供通用的池化抽象(
PooledObjectFactory+GenericObjectPool),能池化任意 Java 对象而非局限于 JDBC,并且是 DBCP2、Redis 客户端(Jedis/Lettuce 池化模式)等生态组件的底层基础。
⚠️ 注意:CentOS 8 归档仓库内的 JDK 17 冻结在 17.0.1(
1:17.0.1.0.12-2.el8_5,见第五章安装回显),这是 EOL 仓库的固有限制。commons-pool2 2.13.1 的 JDK 基线是 Java 8,17.0.1 完全满足;若业务需要更新的 JDK 补丁版本,需改用上游发行包(如 Eclipse Temurin)或迁移到仍在维护的系统版本。
五、方案 A:dnf 安装 JDK 与 Maven + Maven 工程
本节面向常规 Java 项目开发:dnf 安装 JDK 与 Maven,再把 commons-pool2 作为 Maven 依赖引入并跑通最小验证。CentOS 8 场景有两个独有坑(默认 JDK 停在 1.8、Maven 绑定 JDK 8),本节一并实测解决。
5.1 方案说明
链路是:修复后的 dnf 源安装 java-17-openjdk-devel 与 maven → 用 alternatives 把默认 java/javac 切到 17 → 显式 JAVA_HOME 让 Maven 绑定 17 → pom.xml 引入 org.apache.commons:commons-pool2:2.13.1 → 编译运行验证程序。
5.2 安装 java-17-openjdk-devel 与 maven
dnf install -y java-17-openjdk-devel maven
# 输出节选(实测首尾)
Last metadata expiration check: 0:00:08 ago on Thu Oct 15 00:57:23 2026.
Dependencies resolved.
=================================================================================================================
Package Arch Version Repo Size
=================================================================================================================
Installing:
java-17-openjdk-devel x86_64 1:17.0.1.0.12-2.el8_5 appstream 5.1 M
maven noarch 1:3.5.4-5.module_el8.0.0+39+6a9b6e22 appstream 27 k
Upgrading:
crypto-policies noarch 20210617-1.gitc776d3e.el8 baseos 63 k
lua-libs x86_64 5.3.4-12.el8 baseos 118 k
Installing dependencies:
adwaita-cursor-theme noarch 3.28.0-2.el8 appstream 647 k
adwaita-icon-theme noarch 3.28.0-2.el8 appstream 11 M
Transaction Summary
=================================================================================================================
Install 139 Packages
Upgrade 2 Packages
Total download size: 134 M
Complete!
验证点:Complete! 出现且 java-17-openjdk-devel 与 maven 均在 Installing 列表,说明安装成功。注意 maven 以模块(module)形式提供,版本 3.5.4,比 Ubuntu 源的 3.6.3 老。
5.3 切换默认 JDK 到 17(必做)
安装完成后直接查看版本,会发现默认 java 不是 17——maven 模块把 java-1.8.0-openjdk 一并拉了进来并设为默认(实测回显):
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)
确认包清单中同时存在 1.8 与 17(实时回显):
rpm -qa | grep -E "openjdk|maven" | sort
java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64
java-1.8.0-openjdk-devel-1.8.0.312.b07-2.el8_5.x86_64
java-1.8.0-openjdk-headless-1.8.0.312.b07-2.el8_5.x86_64
java-17-openjdk-1:17.0.1.0.12-2.el8_5.x86_64
java-17-openjdk-devel-1:17.0.1.0.12-2.el8_5.x86_64
java-17-openjdk-headless-1:17.0.1.0.12-2.el8_5.x86_64
javapackages-tools-5.3.0-1.module_el8.0.0+11+5b8737ad.noarch
maven-1:3.5.4-5.module_el8.0.0+39+6a9b6e22.noarch
maven-lib-1:3.5.4-5.module_el8.0.0+39+6a9b6e22.noarch
maven-wagon-provider-api-3.1.0-1.module_el8.0.0+39+6a9b6e22.noarch
用 alternatives 把 java 与 javac 的默认项切到 17:
alternatives --set java java-17-openjdk.x86_64
alternatives --set javac java-17-openjdk.x86_64
再次确认(实时回显):
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
⚠️ 注意:实测执行
alternatives --set javac java-17-openjdk.x86_64偶发报错java-17-openjdk has not been configured as an alternative for javac,重跑一次同一命令即可成功(前一条--set java触发的自动模式重算导致的瞬时状态)。若遇此提示,单独重跑该命令即可。
5.4 Maven 绑定 JDK 17(必做)
java/javac 已切到 17,但 CentOS 8 的 mvn 启动脚本默认仍按 1.8 启动(实测回显):
mvn -version | head -3
Apache Maven 3.5.4
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
显式设置 JAVA_HOME 后 Maven 即绑定 17(实时回显):
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
mvn -version | head -3
Apache Maven 3.5.4
Maven home: /usr/share/maven
Java version: 17.0.1, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-17-openjdk-1.17.0.1.0.12-2.el8_5.x86_64
验证点:Java version 从 1.8.0_312 变为 17.0.1。该变量只在当前会话有效,持久化方式见第八章配置说明。
5.5 创建工程并引入依赖
工程结构与 pom 与 Ubuntu 场景完全一致(commons-pool2 零传递依赖,声明一项即引入全部能力):
mkdir -p /root/commons-pool-demo/src/main/java && cd /root/commons-pool-demo
pom.xml(完整内容,文件路径 /root/commons-pool-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>com.example.pool</groupId>
<artifactId>commons-pool-demo</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>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.13.1</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>
逐项说明关键配置:
org.apache.commons:commons-pool2:2.13.1:唯一运行期依赖,Maven 自动下载到~/.m2/repository/org/apache/commons/commons-pool2/2.13.1/。maven.compiler.source/target=17:按 JDK 17 编译;2.13.1 的 JDK 基线是 Java 8(见第四章),如需兼容更老运行环境可下调到1.8。maven-compiler-plugin显式固定为 3.11.0:Maven 3.5.4 自带的默认编译插件较老,固定新插件可保证与 Ubuntu 场景行为一致。project.build.sourceEncoding=UTF-8:源码含中文注释/字符串时防止按 POSIX 默认编码编译报错。
5.6 编译与运行验证
验证程序 PoolCheck.java(文件路径 /root/commons-pool-demo/src/main/java/PoolCheck.java)演示对象池最核心的行为:首次借出触发真实创建、归还进入空闲队列、二次借出按 LIFO 顺序复用且不再新建:
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class PoolCheck {
/* 模拟创建成本 20ms 的昂贵连接对象 */
static class Conn {
final int id;
Conn(int id) { this.id = id; }
}
static class ConnFactory extends BasePooledObjectFactory<Conn> {
final AtomicInteger seq = new AtomicInteger();
@Override public Conn create() throws Exception {
Thread.sleep(20);
return new Conn(seq.incrementAndGet());
}
@Override public PooledObject<Conn> wrap(Conn c) {
return new DefaultPooledObject<>(c);
}
}
public static void main(String[] args) throws Exception {
GenericObjectPoolConfig<Conn> cfg = new GenericObjectPoolConfig<>();
cfg.setMaxTotal(4);
GenericObjectPool<Conn> pool = new GenericObjectPool<>(new ConnFactory(), cfg);
// 首次借出:池为空,触发 3 次对象创建
List<Conn> held = new ArrayList<>();
StringBuilder first = new StringBuilder();
for (int i = 0; i < 3; i++) {
Conn c = pool.borrowObject();
held.add(c);
first.append("Conn-").append(c.id);
if (i < 2) first.append(", ");
}
System.out.println("首次借出: " + first + " numActive=" + pool.getNumActive()
+ ", createdCount=" + pool.getCreatedCount());
// 全部归还
for (Conn c : held) {
pool.returnObject(c);
}
System.out.println("归还后: numIdle=" + pool.getNumIdle() + ", numActive=" + pool.getNumActive());
// 二次借出:全部复用空闲对象(LIFO 顺序),不再新建
StringBuilder second = new StringBuilder();
for (int i = 0; i < 3; i++) {
Conn c = pool.borrowObject();
second.append("Conn-").append(c.id);
if (i < 2) second.append(", ");
}
System.out.println("二次借出: " + second + " createdCount=" + pool.getCreatedCount()
+ "(复用空闲对象,未新建)");
System.out.println("commons-pool2 OK");
pool.close();
}
}
编译(输出节选,实测尾部):
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk && mvn -B clean compile
[INFO] --- maven-compiler-plugin:3.11.0:compile (default-compile) @ commons-pool-demo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file with javac [debug target 17] to target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.263 s
查看依赖树(确认零传递依赖):
mvn -B dependency:tree 2>&1 | grep -E "^\[INFO\] (com\.example|\\\- )"
[INFO] com.example.pool:commons-pool-demo:jar:1.0.0
[INFO] \- org.apache.commons:commons-pool2:jar:2.13.1:compile
运行并观察完整回显:
P=$HOME/.m2/repository/org/apache/commons/commons-pool2/2.13.1/commons-pool2-2.13.1.jar
java -Dfile.encoding=UTF-8 -cp target/classes:$P PoolCheck
首次借出: Conn-1, Conn-2, Conn-3 numActive=3, createdCount=3
归还后: numIdle=3, numActive=0
二次借出: Conn-3, Conn-2, Conn-1 createdCount=3(复用空闲对象,未新建)
commons-pool2 OK
结果解读:首次借出 createdCount=3(创建与借出数一致)、归还后 numIdle=3、二次借出按 LIFO 倒序拿到 Conn-3, Conn-2, Conn-1 且 createdCount 仍为 3(零新建)。commons-pool2 2.13.1 已在 CentOS 8 + JDK 17.0.1 上完整可用。
💡 说明:
-Dfile.encoding=UTF-8用于固定中文输出的字符集。若服务器LANG已为 UTF-8 locale 可省略;默认 POSIX locale 下省略会出现中文变问号(实测复现见《Apache Commons Pool 2.13.1 快速入门与集成示例》3.2 节)。
六、方案 B:官方 bin 包 + jar 直跑(离线友好)
本节面向没有 Maven/构建体系的场景,直接使用官方发布的 jar 包,用 javac + java 完成编译运行。
6.1 方案说明
链路是:从 downloads.apache.org 下载官方 bin 包 → 校验 sha512 → 解压得到 commons-pool2-2.13.1.jar → 用 javac -cp 编译源码 → 用 java -cp 运行。适用于离线环境、脚本化部署或纯粹想「拿到 jar 就能用」的读者。
6.2 下载与完整性校验
cd /root && curl -sO --max-time 120 https://downloads.apache.org/commons/pool/binaries/commons-pool2-2.13.1-bin.tar.gz
curl -sO --max-time 30 https://downloads.apache.org/commons/pool/binaries/commons-pool2-2.13.1-bin.tar.gz.sha512
ls -l commons-pool2-2.13.1-bin.tar.gz
-rw-r--r-- 1 root root 1840650 Oct 15 01:37 commons-pool2-2.13.1-bin.tar.gz
校验 sha512(期望值与实测值必须逐字一致):
echo "期望: $(cat commons-pool2-2.13.1-bin.tar.gz.sha512)"
echo "实测: $(sha512sum commons-pool2-2.13.1-bin.tar.gz | awk '{print $1}')"
期望: 98afb2f67245b65039fb2cbe58dd0e1b1afbc55164dc010948a2a5d72a814e71fbf1c52e88859f812baa758fd12b17c90e86c266204a0d1a0e6e772d19624c5f
实测: 98afb2f67245b65039fb2cbe58dd0e1b1afbc55164dc010948a2a5d72a814e71fbf1c52e88859f812baa758fd12b17c90e86c266204a0d1a0e6e772d19624c5f
⚠️ 注意:若 sha512 不一致,说明下载包损坏或被篡改,须删除后重新下载;切勿跳过校验直接使用。
6.3 解压
tar xzf commons-pool2-2.13.1-bin.tar.gz && ls commons-pool2-2.13.1/
LICENSE.txt
NOTICE.txt
RELEASE-NOTES.txt
apidocs
commons-pool2-2.13.1-javadoc.jar
commons-pool2-2.13.1-sources.jar
commons-pool2-2.13.1-test-sources.jar
commons-pool2-2.13.1-tests.jar
commons-pool2-2.13.1.jar
主 jar 为 commons-pool2-2.13.1.jar(156457 字节,实测):
ls -l commons-pool2-2.13.1/commons-pool2-2.13.1.jar
-rw-r--r-- 1 root root 156457 Dec 30 2025 commons-pool2-2.13.1/commons-pool2-2.13.1.jar
6.4 javac 编译与 java 运行
用官方 jar 作为编译与运行期 classpath(注意 CentOS 8 下先 export JAVA_HOME,确保 javac 是 17,见 5.3/5.4 节):
mkdir -p /root/jar-run && cd /root/jar-run
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
cp /root/commons-pool2-2.13.1/commons-pool2-2.13.1.jar .
cp /root/commons-pool-demo/src/main/java/PoolCheck.java .
javac -encoding UTF-8 -cp commons-pool2-2.13.1.jar -d out PoolCheck.java
编译无任何告警输出。运行:
java -Dfile.encoding=UTF-8 -cp out:commons-pool2-2.13.1.jar PoolCheck
首次借出: Conn-1, Conn-2, Conn-3 numActive=3, createdCount=3
归还后: numIdle=3, numActive=0
二次借出: Conn-3, Conn-2, Conn-1 createdCount=3(复用空闲对象,未新建)
commons-pool2 OK
验证点:java -cp 一行成功打印四组结果,且无 NoClassDefFoundError,说明 jar 直跑可用;与方案 A 的 Maven 运行结果完全一致。
七、方案对比与选择建议
本节汇总两种方案的差异,给出选型建议。两种方案产出的是同一份 commons-pool2 2.13.1 代码,差别仅在获取与装配方式。
| 维度 | 方案 A:dnf + Maven 依赖 | 方案 B:官方 bin 包 + jar 直跑 |
|---|---|---|
| 运行期依赖 | Maven 自动解析 | 手工把 jar 放入 classpath |
| 是否联网 | 首次构建需联网 | 仅下载时需要联网 |
| 依赖版本管控 | pom 统一声明,可锁版本 | 无,靠文件命名区分 |
| 传递依赖 | 零传递依赖(实测依赖树仅自身一个节点) | 同左,无额外负担 |
| 可复现产物 | mvn compile 产出 target/classes | javac 产出 class + 引用 jar |
| JDK 版本 | 17.0.1(EOL 仓库冻结版) | 同左,也可配上游 JDK |
| 适用场景 | 常规工程开发 | 离线脚本、临时验证、无构建体系 |
选型建议:若项目有构建体系(Maven/Gradle),一律选方案 A,版本管控与打包全部自动化;若在无构建工具的老旧服务器上临时验证,或需要把 jar 手工嵌入既有脚本,选方案 B。commons-pool2 恰好零传递依赖,方案 B 的使用成本在所有 Commons 组件里几乎是最低的。两者也可共存——用方案 A 开发、用方案 B 分发 jar。
八、配置说明
本节说明 Commons Pool 使用中真正需要设置的「配置」。它是库而非服务,没有独立配置文件,全部行为通过环境变量或代码参数控制。CentOS 8 场景的核心配置是 JAVA_HOME。
CentOS 8 下 JAVA_HOME 默认未设置,且 Maven 启动脚本会落到 JDK 8(已在 5.4 节实测)。确认当前会话状态(实时回显):
echo "JAVA_HOME=$JAVA_HOME"
JAVA_HOME=
推荐把 JDK 17 的绑定写入 /etc/profile.d/java17.sh,对所有登录会话生效(文件内容如下,写入后新会话自动生效,当前会话可 source /etc/profile.d/java17.sh 立即生效):
cat > /etc/profile.d/java17.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH
EOF
逐项说明:
JAVA_HOME:CentOS 8 上必须显式指向 JDK 17,否则mvn用 JDK 8 运行(实测见 5.4 节回显)。/usr/lib/jvm/java-17-openjdk是 alternatives 维护的通用软链,升级小版本无需改配置。- 代码级「参数」:
GenericObjectPoolConfig的 maxTotal/maxIdle/maxWait、testOnBorrow 等检测开关、驱逐线程周期与 LIFO 借出顺序等,全部通过构造池时的 Config 对象控制,无外部配置文件。各参数的完整默认值与实测行为见《Apache Commons Pool 2.13.1 配置参数详解》。
九、常见问题(FAQ)
Q1:dnf makecache 报 Curl error (6) 无法解析 mirrorlist.centos.org?
CentOS 8 已 EOL,mirrorlist 服务已下线。按第三章切换到归档镜像(本文用阿里云 centos-vault)即可恢复。
Q2:按网上教程把 baseurl 指到 vault.centos.org 还是失败?
官方归档站在部分网络环境返回 403(本文第二章实测)。改用国内归档镜像(如 https://mirrors.aliyun.com/centos-vault/8.5.2111/),注意把 baseurl 中的 $contentdir/$releasever 一并替换为 8.5.2111。
Q3:装完 java -version 显示的还是 1.8?
maven 模块把 java-1.8.0-openjdk 作为依赖带入并设为默认(本文 5.3 节实测复现)。执行 alternatives --set java java-17-openjdk.x86_64 与 alternatives --set javac java-17-openjdk.x86_64 切换。
Q4:alternatives 切了 17,mvn -version 还是显示 Java 1.8.0_312?
CentOS 8 的 mvn 启动脚本不跟随 alternatives 的默认 java,需要显式 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk(本文 5.4 节实测复现),并按第八章持久化。
Q5:仓库里的 JDK 17.0.1 太老,有安全补丁需求怎么办? 这是 CentOS 8 EOL 仓库的固有限制(冻结在 8.5.2111 版本线)。要么改用上游 JDK 发行包(Eclipse Temurin 等),要么迁移到仍在维护的系统;commons-pool2 2.13.1 本身只要求 Java 8+,对 JDK 补丁版本无要求。
Q6:运行验证程序时 borrowObject 抛 NoSuchElementException?
这不是安装问题,是池容量(maxTotal)被占满且等待超时的正常业务表现。调参思路与两类异常的实测回显见《Apache Commons Pool 2.13.1 配置参数详解》5.2 节。
十、卸载与清理
Commons Pool 本身不产生系统级安装,卸载即移除依赖与本地文件。
移除工程、实验目录与 bin 包(实时回显):
rm -rf /root/commons-pool-demo /root/jar-run /root/commons-pool2-2.13.1 /root/commons-pool2-2.13.1-bin.tar.gz
ls /root/commons-pool-demo 2>&1
ls: cannot access '/root/commons-pool-demo': No such file or directory
移除 Maven 本地仓库中的 commons-pool2(影响所有工程,慎用):
rm -rf $HOME/.m2/repository/org/apache/commons/commons-pool2
卸载 JDK 与 Maven(dnf 会连未使用的依赖一起清除):
dnf remove -y java-17-openjdk-devel maven
# 输出节选(实测首尾)
Dependencies resolved.
==================================================================================================================
Package Arch Version Repository Size
==================================================================================================================
Removing:
java-17-openjdk-devel x86_64 1:17.0.1.0.12-2.el8_5 @appstream 8.9 M
maven noarch 1:3.5.4-5.module_el8.0.0+39+6a9b6e22 @appstream 3.1 k
Removing unused dependencies:
abattis-cantarell-fonts noarch 0.0.25-6.el8 @appstream 295 k
adwaita-cursor-theme noarch 3.28.0-2.el8 @appstream 11 M
Complete!
清理残留的孤儿依赖并确认卸载干净:
dnf autoremove -y
java -version 2>&1 | head -1
mvn -version 2>&1 | head -1
bash: java: command not found
bash: mvn: command not found
验证点:java 与 mvn 均提示 command not found,说明卸载彻底。如需恢复,重跑 5.2 至 5.4 节即可(软件源已在第三章修复,无需重复操作)。
十一、参考链接
- Apache Commons Pool 官方主页:https://commons.apache.org/proper/commons-pool/
- Apache Commons Pool 官方下载目录:https://downloads.apache.org/commons/pool/
- Commons Pool 2.13.1 发布说明:https://downloads.apache.org/commons/pool/RELEASE-NOTES.txt
- Commons Pool Javadoc(GenericObjectPool/GenericKeyedObjectPool/PooledObjectFactory):https://commons.apache.org/proper/commons-pool/apidocs/
- Maven 中央仓库 commons-pool2 坐标:https://repo1.maven.org/maven2/org/apache/commons/commons-pool2/
- CentOS Linux EOL 说明与归档指引:https://www.centos.org/centos-linux-eol/
- 阿里云 CentOS 归档镜像:https://mirrors.aliyun.com/centos-vault/