CentOS 8 安装 Apache Commons Statistics 指南
在 CentOS 8 上从零安装 Apache Commons Statistics 1.3,覆盖 EOL 后切换归档软件源、安装 JDK 17 与 Maven、JAVA_HOME 与 alternatives 配置、Maven 依赖与官方 bin 包两种方案,命令回显均实测通过。
CentOS 8 安装 Apache Commons Statistics 指南
目标:在 CentOS 8 上从零搭建 Apache Commons Statistics 1.3 的开发与运行环境(JDK 17 + Maven 3.5.4 + 官方依赖),处理 CentOS 8 停止维护(EOL)后的软件源切换与多版本 JDK 共存问题,并完成最小验证工程的编译运行;本文全部命令与回显均已在 CentOS 8 实测通过。
Apache Commons Statistics 是 Apache Commons 项目下的统计工具库,按功能拆分为多个模块:descriptive(描述统计)、inference(假设检验)、interval(置信区间)、ranking(排名)、distribution(概率分布),另提供 bom 供统一版本管理。它是纯 Java 库,没有独立进程与常驻服务,安装的本质是「配好软件源与 JDK/构建工具 → 按需引入模块依赖 → 写最小验证代码 → 编译运行」。CentOS 8 已于 2021 年 12 月 31 日 EOL,官方源 mirror.centos.org 已下线,因此本文先解决归档源配置,再完成 JDK 17 + Maven 安装(CentOS 8 默认把 Maven 绑定到 JDK 8,需显式指定 JAVA_HOME,这是与 Ubuntu 最大的差异点),最后给出 Maven 依赖与官方 bin 包两种落地方式。
一、环境信息
本节先固定可复现的基线环境,后续所有命令均在此环境执行。
- 操作系统:CentOS Linux 8(内核自带 yum/dnf 工具链,2021-12-31 EOL,官方源已下线,需切换归档源,见第三章)
- 架构:x86_64
- JDK:OpenJDK 17.0.1(dnf 包
java-17-openjdk-devel-17.0.1.0.12-2.el8_5) - 构建工具:Apache Maven 3.5.4(
maven-3.5.4-5.module_el8.0.0+39+6a9b6e22,需显式JAVA_HOME指向 JDK 17) - 组件版本:commons-statistics 1.3(官方当前最新稳定版,2026-04-27 构建)
- 官方下载目录:
https://downloads.apache.org/commons/statistics/ - Maven 坐标:
org.apache.commons:commons-statistics-descriptive:1.3(本文最小验证使用;其余模块见第四章清单) - 验证用工作目录:
/work/install-demo(Maven 工程)、/work/centos-jar-run(jar 直跑)、/work/commons-statistics-1.3(bin 包解压目录)
系统与架构确认(实时回显):
cat /etc/os-release | head -3
NAME="CentOS Linux"
VERSION="8"
ID="centos"
uname -m
x86_64
💡 说明:Commons Statistics 是库而非服务,环境中不存在需要常驻的守护进程;「安装完成」的判定标准是可编译并运行一个调用其 API 的最小程序,而不是某个端口处于监听状态。
二、前置条件
本节说明安装前必须满足的条件。CentOS 8 已 EOL,软件源状态是首要检查项。
- 具有 root 或 sudo 权限的 CentOS 8 系统。
- 可访问归档镜像源。实测官方归档
vault.centos.org在部分网络返回 403,阿里云归档镜像https://mirrors.aliyun.com/centos-vault/可用,实测均可达性如下(实时回显):
curl -sI --max-time 15 https://vault.centos.org/8.5.2111/AppStream/x86_64/os/ | head -1
HTTP/1.1 403 Forbidden
curl -sI --max-time 15 https://mirrors.aliyun.com/centos-vault/8.5.2111/AppStream/x86_64/os/ | head -1
HTTP/1.1 200 OK
- 可访问 Apache 官方下载站
downloads.apache.org与 Maven 中央仓库repo1.maven.org(本文实测网络直连可达)。 - 至少 2 GB 可用磁盘空间(JDK + Maven + 依赖合计约 600 MB)。
三、软件源配置(EOL 归档源切换)
本节解决 CentOS 8 EOL 后无法直接安装软件的问题,是后续所有 dnf 操作的前置步骤。
先确认默认源已不可用(实时回显):
dnf makecache 2>&1 | head -3
CentOS Linux 8 - AppStream 0.0 B/s | 0 B 00:55
Errors during downloading metadata for repository 'appstream':
- Curl error (6): Couldn't resolve host name for http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream&infra=stock [Could not resolve host: mirrorlist.centos.org]
mirrorlist.centos.org 已停止解析,必须切换到归档源。CentOS 8 各小版本的归档仓库独立存放(如 8.4.2105、8.5.2111),而 JDK 17(java-17-openjdk)在 8.5.2111 的 AppStream 仓库中才提供,因此本文统一指向 8.5.2111 归档。备份旧源并写入新源文件(完整内容,文件路径 /etc/yum.repos.d/CentOS-Vault-Aliyun.repo):
mkdir -p /etc/yum.repos.d/backup && mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/backup/
[AppStream]
name=CentOS-Vault-Aliyun-8.5.2111-AppStream
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/AppStream/x86_64/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official
[BaseOS]
name=CentOS-Vault-Aliyun-8.5.2111-BaseOS
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/x86_64/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official
[Extras]
name=CentOS-Vault-Aliyun-8.5.2111-Extras
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/extras/x86_64/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official
逐项说明关键配置:
baseurl:直接写死8.5.2111而不用$releasever变量,因为 CentOS 8 的$releasever解析为8,归档仓库没有centos-vault/8/这一层目录,必须落到具体小版本。gpgkey:注意不要写https://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-Official——该路径实测不存在(HTTP 404),会导致 GPG 校验失败并中止安装(实测踩坑记录见 4.2 节);正确的 key 在https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official。- 三个仓库:
AppStream提供 java-17 与 maven,BaseOS提供基础依赖包,Extras备用。
刷新元数据缓存:
dnf clean all && dnf makecache
# 输出节选(实测首尾)
CentOS-Vault-Aliyun-8.5.2111-AppStream
CentOS-Vault-Aliyun-8.5.2111-BaseOS
Metadata Cache Created.
确认 JDK 17 与 Maven 在源中可用:
dnf list available java-17-openjdk-devel 2>&1 | tail -1
dnf list available maven 2>&1 | tail -1
java-17-openjdk-devel.x86_64 1:17.0.1.0.12-2.el8_5 appstream
maven.noarch 3.5.4-5.module_el8.0.0+39+6a9b6e22 appstream
四、版本选型说明
本节给出 Commons Statistics 的版本谱系与模块清单,帮助读者确定「装哪个版本、装哪些模块」。截至实测日期,官方下载目录 https://downloads.apache.org/commons/statistics/binaries/ 上仅提供 1.3 一个版本线,实测清单如下:
curl -s https://downloads.apache.org/commons/statistics/binaries/ | grep -oE 'href="commons-statistics[^"]*"' | sort -u
commons-statistics-1.3-bin.tar.gz
commons-statistics-1.3-bin.tar.gz.asc
commons-statistics-1.3-bin.tar.gz.sha512
commons-statistics-1.3-bin.zip
commons-statistics-1.3-bin.zip.asc
commons-statistics-1.3-bin.zip.sha512
版本谱系(Maven 中央仓库实测元数据):
| 版本线 | 最新版 | 发布节奏 | Java 基线 | 适用场景 |
|---|---|---|---|---|
| 1.0 | 1.0 | 2021 年首发 | Java 8+ | 历史版本,不建议新用 |
| 1.1 | 1.1 | 2023 年 | Java 8+ | 引入 inference/ranking/bom |
| 1.2 | 1.2 | 2024 年 | Java 8+ | 引入 interval 模块 |
| 1.3(当前主线) | 1.3 | 2026-05-05 | Java 8+ | 所有新项目默认选择 |
本文实际采用 1.3,理由是它是官方下载站与 Maven 中央仓库当前的 latest/release 版本,且对 JDK 17 完全兼容。
Commons Statistics 1.3 的模块清单(与官方 RELEASE-NOTES.txt 宣布的模块一致,均经 Maven 中央仓库逐一核实):
| 模块 artifactId | 中央仓库版本谱系 | 职责 | 选装建议 |
|---|---|---|---|
| commons-statistics-descriptive | 1.1 至 1.3 | 均值/方差/分位数等描述统计 | 核心模块,必选 |
| commons-statistics-inference | 1.1 至 1.3 | t 检验/卡方/二项检验等假设检验 | 需要统计推断时选装 |
| commons-statistics-interval | 1.2 至 1.3 | 二项比例与正态置信区间 | 需要区间估计时选装 |
| commons-statistics-ranking | 1.1 至 1.3 | 排名与平局处理 | 需要排名时选装 |
| commons-statistics-distribution | 1.0 至 1.3 | 概率分布与采样 | inference 的传递依赖,也可独立使用 |
| commons-statistics-bom | 1.1 至 1.3 | BOM 版本清单(POM) | 多模块统一版本时选装 |
💡 技术拓展:多模块库的依赖引入策略常见两种做法,对比如下——
策略 做法 特点 适用场景 按需单模块引入 每个功能模块单独声明依赖 依赖面最小,版本号逐个维护 只用一两个模块 BOM 统一管理 dependencyManagement导入 bom,依赖不写版本版本一处管控,模块按需声明 使用三个及以上模块 本文方案 A 演示按需单模块引入(最小验证只用 descriptive);BOM 用法在《Apache Commons Statistics 1.3 快速入门与集成示例》第三章实测。
版本确认为 1.3 的实测回显(Maven 中央仓库元数据):
curl -s https://repo1.maven.org/maven2/org/apache/commons/commons-statistics-descriptive/maven-metadata.xml | grep -E "latest|release"
<latest>1.3</latest>
<release>1.3</release>
五、方案 A:Maven 依赖安装(在线,推荐)
本节面向常规 Java 项目开发,通过 dnf 安装 JDK 17 与 Maven,再配置 JAVA_HOME,引入 commons-statistics 依赖并跑通最小验证程序。
5.1 方案说明
方案 A 的链路是:dnf 安装 java-17-openjdk-devel 与 maven → 显式配置 JAVA_HOME 指向 JDK 17 → 在 pom.xml 中声明 org.apache.commons:commons-statistics-descriptive:1.3 → Maven 自动下载依赖 → 编译并运行验证程序。CentOS 8 特有的一点:dnf install maven 会连带安装 java-1.8.0-openjdk 作为依赖,且系统默认 java 命令指向 1.8,必须显式指定 JAVA_HOME 才能让 Maven 用上 JDK 17,本文 5.3 节有完整实测。
5.2 安装 JDK 17 与 Maven
dnf install -y java-17-openjdk-devel maven
# 输出节选(实测首尾)
Installing group/module packages:
maven noarch 3.5.4-5.module_el8.0.0+39+6a9b6e22 appstream
Installing dependencies:
java-17-openjdk x86_64 1:17.0.1.0.12-2.el8_5 appstream
java-1.8.0-openjdk-headless x86_64 1:1.8.0.312.b07-2.el8 appstream
Installed:
java-17-openjdk-devel-1:17.0.1.0.12-2.el8_5.x86_64 maven-3.5.4-5.module_el8.0.0+39+6a9b6e22.noarch
Complete!
注意回显中的 java-1.8.0-openjdk-headless:Maven 3.5.4 的模块依赖把 JDK 8 一并装上了。确认两个包都已就位:
rpm -q java-17-openjdk-devel maven
java-17-openjdk-devel-17.0.1.0.12-2.el8_5.x86_64
maven-3.5.4-5.module_el8.0.0+39+6a9b6e22.noarch
查看当前默认 java 指向与 alternatives 候选(实时回显):
java -version 2>&1
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 --list | grep java
java auto /usr/lib/jvm/java-1.8.0-openjdk.x86_64
验证点:默认 java 是 1.8.0_312(auto 模式),这就是 CentOS 8 上 Maven 相关操作必须显式指定 JAVA_HOME 的根源。
5.3 配置 JAVA_HOME 与默认 Java(CentOS 关键步骤)
不设 JAVA_HOME 时,Maven 绑定到 JDK 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.x86_64/jre
此时直接构建 maven.compiler.release=17 的工程会失败(实测回显):
cd /work/install-demo && mvn -q -B package 2>&1 | tail -4; echo "BUILD_EXIT=$?"
Fatal error compiling: invalid flag: --release
BUILD_EXIT=1
原因:JDK 8 的 javac 不认识 --release 参数(该参数自 JDK 9 引入)。修复分两层:
第一层,让 Maven 用上 JDK 17——导出 JAVA_HOME(Maven 优先读取它定位 JDK):
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
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
第二层,让命令行的 java/javac 也指向 17(否则编译出的 class 无法用默认 java 运行,实测踩坑见 FAQ Q3)。持久化切换:
alternatives --set java java-17-openjdk.x86_64
java -version 2>&1
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment 18.9 (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 17.0.1+12-LTS, mixed mode, sharing)
⚠️ 注意:
export JAVA_HOME只对当前会话生效。要持久化,把export JAVA_HOME=/usr/lib/jvm/java-17-openjdk追加到/etc/profile.d/java17.sh并重新登录,或写入项目启动脚本。
5.4 创建工程并引入依赖
建立一个标准 Maven 工程,pom.xml 中声明 commons-statistics-descriptive 依赖,并用 maven-shade-plugin 打成可直接运行的胖 jar。
mkdir -p /work/install-demo/src/main/java
pom.xml(完整内容,文件路径 /work/install-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>demo</groupId>
<artifactId>statistics-install-demo</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-statistics-descriptive</artifactId>
<version>1.3</version>
</dependency>
</dependencies>
<build>
<finalName>statistics-install-demo</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>QuickStart</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
逐项说明关键配置:
org.apache.commons:commons-statistics-descriptive:1.3:最小验证的唯一运行期依赖。需要假设检验、置信区间、排名能力时,按第四章清单追加对应模块。maven.compiler.release=17:按 JDK 17 语义编译;Commons Statistics 1.3 字节码基线是 Java 8,目标机若是 JDK 8 可改回8。maven-compiler-plugin 3.11.0显式固定:CentOS 8 的 Maven 3.5.4 内置的 compiler 插件版本更老,不固定会退回旧版行为。maven-shade-plugin:把依赖打进最终 jar,Main-Class设为QuickStart。finalName:固定产物名statistics-install-demo.jar。
5.5 最小验证代码
验证程序 QuickStart.java(文件路径 /work/install-demo/src/main/java/QuickStart.java)覆盖 descriptive 模块最常用的均值与样本方差:
import org.apache.commons.statistics.descriptive.Mean;
import org.apache.commons.statistics.descriptive.Variance;
public class QuickStart {
public static void main(String[] args) {
double[] data = {9, 2, 5, 4, 12, 7, 8, 11, 9, 3};
Mean mean = Mean.of(data);
Variance variance = Variance.of(data);
System.out.println("n=" + data.length
+ " mean=" + mean.getAsDouble()
+ " variance=" + variance.getAsDouble());
System.out.println("commons-statistics OK");
}
}
程序对 10 个测量值计算均值与样本方差。手算核对:总和 70 → 均值 7.0;偏差平方和 104 → 样本方差 104/9 = 11.5556。
5.6 编译与运行验证
在 JAVA_HOME 指向 JDK 17 的前提下打包:
cd /work/install-demo && time mvn -q -B package
echo "BUILD_EXIT=$?"
real 1m10.411s
BUILD_EXIT=0
-q 静默模式下无输出即成功;首次构建实测耗时约 1 分钟(下载依赖与插件,视网速而定)。运行验证:
alternatives --set java java-17-openjdk.x86_64
java -Dfile.encoding=UTF-8 -jar target/statistics-install-demo.jar
n=10 mean=7.0 variance=11.555555555555555
commons-statistics OK
结果解读:均值 7.0 与方差 11.555555555555555 均与手算一致(70/10、104/9),commons-statistics OK 打印正常无乱码。这表示 commons-statistics-descriptive 1.3 已在 CentOS 8 的 JDK 17 上完整可用。
验证依赖树确实解析到了传递依赖(实时回显):
cd /work/install-demo && mvn -B dependency:tree 2>&1 | grep -E "\+-|\\\\-"
[INFO] \- org.apache.commons:commons-statistics-descriptive:jar:1.3:compile
[INFO] +- org.apache.commons:commons-numbers-core:jar:1.3:compile
[INFO] \- org.apache.commons:commons-numbers-arrays:jar:1.3:compile
⚠️ 注意:descriptive 1.3 传递依赖
commons-numbers-core:1.3与commons-numbers-arrays:1.3。Maven 方案下自动就位;若用第六章 jar 直跑方式漏掉这两个 jar,会报NoClassDefFoundError: org/apache/commons/numbers/core/Sum。
六、方案 B:官方 bin 包 + jar 直跑(离线友好)
本节面向没有 Maven/构建体系的场景,直接使用官方 bin 包,用 javac + java 完成编译运行。
6.1 方案说明
链路是:从 downloads.apache.org 下载官方 bin 包 → 校验 sha512 → 解压得到各模块 jar → 从 Maven 中央仓库补齐传递依赖 jar → 用 javac -cp 编译 → java -cp 运行。
6.2 下载与完整性校验
cd /work && curl -sO --max-time 120 https://downloads.apache.org/commons/statistics/binaries/commons-statistics-1.3-bin.tar.gz
curl -sO --max-time 30 https://downloads.apache.org/commons/statistics/binaries/commons-statistics-1.3-bin.tar.gz.sha512
ls -l commons-statistics-1.3-bin.tar.gz
-rw-r--r-- 1 root root 3446293 Oct 15 02:40 commons-statistics-1.3-bin.tar.gz
校验 sha512(期望值与实测值必须逐字一致):
echo "期望: $(cat commons-statistics-1.3-bin.tar.gz.sha512 | cut -c1-64)"
echo "实测: $(sha512sum commons-statistics-1.3-bin.tar.gz | awk '{print $1}' | cut -c1-64)"
期望: e49b6d8f20a23995e38f92b2635398adf08683f27b7045590dd3eb717eac6f4a
实测: e49b6d8f20a23995e38f92b2635398adf08683f27b7045590dd3eb717eac6f4a
⚠️ 注意:若 sha512 不一致,说明下载包损坏或被篡改,须删除后重新下载;切勿跳过校验直接使用。
6.3 解压
cd /work && tar xzf commons-statistics-1.3-bin.tar.gz && ls commons-statistics-1.3/ | grep -c jar
15
bin 包内含 5 个功能模块(descriptive、distribution、inference、interval、ranking)各自的 1.3 主 jar、javadoc、sources 共 15 个 jar 文件。主 jar 为 commons-statistics-descriptive-1.3.jar(126542 字节)。
6.4 补齐传递依赖并运行
从 Maven 中央仓库下载 descriptive 的两个传递依赖 jar,并校验主包 sha1:
N=https://repo1.maven.org/maven2/org/apache/commons
mkdir -p /work/centos-jar-run && cd /work/centos-jar-run
cp /work/commons-statistics-1.3/commons-statistics-descriptive-1.3.jar .
curl -sO $N/commons-numbers-core/1.3/commons-numbers-core-1.3.jar
curl -sO $N/commons-numbers-arrays/1.3/commons-numbers-arrays-1.3.jar
curl -sO $N/commons-statistics-descriptive/1.3/commons-statistics-descriptive-1.3.jar.sha1
echo "期望: $(cat commons-statistics-descriptive-1.3.jar.sha1)"
echo "实测: $(sha1sum commons-statistics-descriptive-1.3.jar | awk '{print $1}')"
期望: 78bf65c19c6bd634b97064bc82268c1e95aad375
实测: 78bf65c19c6bd634b97064bc82268c1e95aad375
复制验证源码,先 mkdir -p out 再编译——CentOS 8 的 javac 17.0.1 实测不会自动创建 -d 目标目录(与 17.0.20 行为不同,属真实坑点),目录不存在会报 javac: directory not found: out:
cp /work/install-demo/src/main/java/QuickStart.java .
mkdir -p out
javac -encoding UTF-8 -cp commons-statistics-descriptive-1.3.jar:commons-numbers-core-1.3.jar:commons-numbers-arrays-1.3.jar -d out QuickStart.java
echo "JAVAC_EXIT=$?"
JAVAC_EXIT=0
运行(classpath 用冒号分隔,依次为编译产物、descriptive 主 jar、两个 numbers 传递依赖 jar):
java -Dfile.encoding=UTF-8 -cp out:commons-statistics-descriptive-1.3.jar:commons-numbers-core-1.3.jar:commons-numbers-arrays-1.3.jar QuickStart
n=10 mean=7.0 variance=11.555555555555555
commons-statistics OK
验证点:输出与方案 A 完全一致。若漏掉两个 numbers jar,运行时报 NoClassDefFoundError: org/apache/commons/numbers/core/Sum(Ubuntu 环境实测复现,原因相同:Mean.of 内部触发 numbers 类加载)。其余模块(inference、interval、ranking、distribution)的 jar 直跑同理需手工补齐各自传递依赖,工程上建议直接用方案 A。
七、方案对比与选择建议
本节汇总两种方案的差异,给出选型建议。两种方案产出的是同一份 commons-statistics 1.3 代码,差别仅在获取与装配方式。
| 维度 | 方案 A:Maven 依赖 | 方案 B:官方 bin 包 + jar 直跑 |
|---|---|---|
| 运行期依赖 | Maven 自动解析(含 numbers 传递依赖) | 手工把 jar 放入 classpath,易漏 |
| 是否联网 | 首次构建需联网 | 仅下载时需要联网 |
| 依赖版本管控 | pom 统一声明,可锁版本 | 无,靠文件命名区分 |
| JDK 绑定 | 由 JAVA_HOME 决定,必须显式设置 | 由 alternatives 决定,需 --set 到 17 |
| 多模块协同 | 声明对应模块即可 | 需手工收集全部 jar |
| 适用场景 | 常规工程开发 | 离线脚本、临时验证、无构建体系 |
选型建议:CentOS 8 上强烈建议方案 A,但务必先完成 5.3 节的两层 JDK 配置(JAVA_HOME + alternatives),否则会遇到「Maven 用 JDK 8 编译失败」或「编译成功但默认 java 跑不起来」两类问题。方案 B 适合离线服务器或临时验证。
八、配置说明
本节说明 Commons Statistics 使用中真正需要设置的「配置」。它是库而非服务,没有独立配置文件,全部行为通过代码参数或 JDK 环境变量控制。
环境变量 JAVA_HOME 在 CentOS 8 上是必须项(实时回显为初始状态):
echo "JAVA_HOME=$JAVA_HOME"
JAVA_HOME=
逐项说明:
JAVA_HOME=/usr/lib/jvm/java-17-openjdk:CentOS 8 的 Maven 3.5.4 不带 Ubuntu 那样的自动定位逻辑,JAVA_HOME为空时它绑定alternatives的默认 java(1.8),导致--release报错(5.3 节实录)。该变量必须显式导出,持久化做法是写入/etc/profile.d/java17.sh。alternatives --set java java-17-openjdk.x86_64:持久化把系统默认java命令切到 17。只设JAVA_HOME不切 alternatives 时,mvn package能成功但java -jar会报UnsupportedClassVersionError(FAQ Q3 实录)。- 代码级「参数」:统计量默认配置(如
Variance默认无偏、Median/Quantile默认不拷贝输入数组)均通过 API 链式方法(setBiased、withCopy等)控制,无外部配置文件。各 API 的完整行为见《Apache Commons Statistics 1.3 常用 API 与统计工具详解》。
九、常见问题(FAQ)
Q1:为什么 java -version 显示 1.8 而我装的是 JDK 17?
dnf install maven 连带安装了 java-1.8.0-openjdk(Maven 模块的依赖),且 alternatives 的 java 处于 auto 模式、优先级指向 1.8(5.2 节回显)。修复:alternatives --set java java-17-openjdk.x86_64 持久切换,或每次运行时用绝对路径 /usr/lib/jvm/java-17-openjdk/bin/java。
Q2:mvn package 报 Fatal error compiling: invalid flag: --release?
Maven 绑定到了 JDK 8(其 javac 不支持 --release 参数,5.3 节实录)。修复:export JAVA_HOME=/usr/lib/jvm/java-17-openjdk 后重新构建;持久化写入 /etc/profile.d/java17.sh。
Q3:mvn package 成功但 java -jar 报 UnsupportedClassVersionError?
完整报错形如 UnsupportedClassVersionError: QuickStart has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0(实测复现)。原因:编译用了 JAVA_HOME 里的 JDK 17(class 文件版本 61.0),而命令行 java 仍是 1.8(最高识别 52.0)。修复:alternatives --set java java-17-openjdk.x86_64,使编译与运行同为 17。
Q4:dnf 安装时报 GPG key 获取失败(HTTP 404)?
归档仓库配置里把 gpgkey 指到了 mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-Official,该路径不存在(实测 404),整个安装事务会被中止。修复:把 gpgkey 改为 https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official(第三章 repo 文件已用正确地址),然后重新 dnf install。
Q5:jar 直跑报 NoClassDefFoundError: org/apache/commons/numbers/core/Sum?
classpath 缺少传递依赖。descriptive 1.3 依赖 commons-numbers-core:1.3 与 commons-numbers-arrays:1.3(5.6 节依赖树实测)。修复:把两个 numbers jar 加入 -cp(6.4 节完整命令),或改用方案 A。
Q6:javac 报 directory not found: out?
CentOS 8 源里的 javac 17.0.1 不会自动创建 -d 指定的输出目录(实测),目录不存在时直接报错退出。修复:编译前先 mkdir -p out(6.4 节已含)。
Q7:commons-statistics 1.3 能不能跑在 JDK 8 上?
可以。官方 RELEASE-NOTES.txt 明确标注 Requires Java 8,字节码基线为 Java 8。但 CentOS 8 上仍建议用 JDK 17 构建(maven.compiler.release 相应改回 8),避免混用两套 JDK 造成 5.3 节与 Q3 的两类错误。
十、卸载与清理
Commons Statistics 本身不产生系统级安装,卸载即移除依赖与本地文件。
移除验证工程与缓存文件(清理本文创建的所有产物):
rm -rf /work/install-demo /work/centos-jar-run /work/commons-statistics-1.3 /work/commons-statistics-1.3-bin.tar.gz /work/commons-statistics-1.3-bin.tar.gz.sha512
ls /work/install-demo 2>&1
ls: cannot access '/work/install-demo': No such file or directory
移除 Maven 本地仓库中的 statistics 模块(影响所有工程,慎用):
rm -rf $HOME/.m2/repository/org/apache/commons/commons-statistics-descriptive
卸载 JDK 与 Maven 并恢复原软件源(仅当不再需要)。先以 -s 预演确认将删除的包,无误后去掉 -s 真正执行:
dnf remove java-17-openjdk-devel maven --assumeno 2>&1 | head -12
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
adwaita-icon-theme noarch 3.28.0-2.el8 @AppStream 13 M
alsa-lib x86_64 1.2.5-4.el8 @AppStream 1.4 M
确认无误后真正卸载(实际生产环境执行):
dnf remove -y java-17-openjdk-devel maven && dnf autoremove -y
rm -rf /etc/yum.repos.d/CentOS-Vault-Aliyun.repo && mv /etc/yum.repos.d/backup/CentOS-*.repo /etc/yum.repos.d/ && rmdir /etc/yum.repos.d/backup
十一、参考链接
- Apache Commons Statistics 官方主页:https://commons.apache.org/proper/commons-statistics/
- Apache Commons Statistics 官方下载目录:https://downloads.apache.org/commons/statistics/
- Commons Statistics 1.3 发布说明:https://downloads.apache.org/commons/statistics/RELEASE-NOTES.txt
- Maven 中央仓库坐标页:https://repo1.maven.org/maven2/org/apache/commons/commons-statistics-descriptive/
- CentOS Vault 官方归档:https://vault.centos.org/
- 阿里云 CentOS 归档镜像:https://mirrors.aliyun.com/centos-vault/