Ubuntu 22.04 安装 Apache Commons Statistics 指南
在 Ubuntu 22.04 上从零安装 Apache Commons Statistics 1.3,覆盖 JDK 17 与 Maven 环境、五个功能模块选装、Maven 依赖与官方 bin 包两种方案、传递依赖与 jar 直跑排错,命令回显均实测通过。
Ubuntu 22.04 安装 Apache Commons Statistics 指南
目标:在 Ubuntu 22.04 上从零搭建 Apache Commons Statistics 1.3 的开发与运行环境(JDK 17 + Maven 3.6.3 + 官方依赖),理解其多模块组织并完成最小验证工程的编译运行;本文全部命令与回显均已在 Ubuntu 22.04 实测通过。
Apache Commons Statistics 是 Apache Commons 项目下的统计工具库,按功能拆分为多个模块:descriptive(描述统计)、inference(假设检验)、interval(置信区间)、ranking(排名)、distribution(概率分布),另提供 bom 供统一版本管理。它是纯 Java 库,没有独立进程与常驻服务,安装的本质就是「装好 JDK/构建工具 → 按需引入模块依赖 → 写最小验证代码 → 编译运行」。本文给出两种落地方式:面向开发的 Maven 依赖方案,以及面向无构建体系场景的官方 bin 包 + jar 直跑方案。
一、环境信息
本节先固定可复现的基线环境,后续所有命令均在此环境执行。
- 操作系统:Ubuntu 22.04.5 LTS
- 架构:x86_64
- JDK:OpenJDK 17.0.20.1(apt 包
openjdk-17-jdk) - 构建工具:Apache Maven 3.6.3
- 组件版本: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/jar-run(jar 直跑)、/work/commons-statistics-1.3(bin 包解压目录)
系统与架构确认(实时回显):
cat /etc/os-release | head -3
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
uname -m
x86_64
💡 说明:Commons Statistics 是库而非服务,环境中不存在需要常驻的守护进程;「安装完成」的判定标准是可编译并运行一个调用其 API 的最小程序,而不是某个端口处于监听状态。
二、前置条件
本节说明安装前必须满足的条件。Ubuntu 22.04 自带可用的软件源,联网即可通过 apt 获取 JDK 与 Maven。
- 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
- 可访问 Ubuntu 官方软件源(
apt update能正常拉取索引)。 - 可访问 Apache 官方下载站
downloads.apache.org与 Maven 中央仓库repo1.maven.org(本文实测网络直连可达)。 - 至少 2 GB 可用磁盘空间(JDK + Maven + 依赖合计约 500 MB)。
网络连通性确认(实时回显):
curl -sI --max-time 20 https://downloads.apache.org/commons/statistics/ | head -3
HTTP/1.1 200 OK
Date: Thu, 15 Oct 2026 02:33:48 GMT
Server: Apache
curl -sI --max-time 20 https://repo1.maven.org/maven2/org/apache/commons/commons-statistics-descriptive/ | head -1
HTTP/2 200
三、版本选型说明
本节给出 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,依赖不写版本版本一处管控,模块按需声明 使用三个及以上模块 直接引 parent 不适用 parent 是构建父 POM,不提供依赖管理导入 无 本文方案 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 项目开发,通过 apt 安装 JDK 与 Maven,再用 Maven 坐标引入 commons-statistics 依赖并跑通最小验证程序。这是最贴合工程实践的方式。
4.1 方案说明
方案 A 的链路是:apt 安装 openjdk-17-jdk 与 maven → 在 pom.xml 中声明 org.apache.commons:commons-statistics-descriptive:1.3 → Maven 自动从中央仓库下载 jar 到本地仓库 → 编译并运行验证程序。优点是版本由 pom 统一管控、依赖自动解析;缺点是首次构建需要联网(本文实测首次构建耗时约 5 分钟,视网速而定)。
4.2 安装 JDK 17
Ubuntu 22.04 官方源内置 openjdk-17-jdk,直接安装即可:
apt-get update -qq && apt-get install -y openjdk-17-jdk
# 输出节选(实测首尾)
Setting up openjdk-17-jdk:amd64 (17.0.20.1+1-1~22.04) ...
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...
安装后确认版本:
java -version
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)
验证点:java -version 能输出 17.0.x 即表示 JDK 就绪;若仍指向旧版本,用 update-alternatives --config java 选择 17。
4.3 安装 Maven
apt-get install -y maven
# 输出节选(实测首尾)
Setting up maven (3.6.3-5) ...
确认版本与 Maven 实际使用的 JDK:
mvn -version | head -4
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.20.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: en_US, platform encoding: ANSI_X3.4-1968
验证点:Java version 一行显示 17.0.20.1,说明 Maven 已绑定到 JDK 17,无需额外设置 JAVA_HOME。注意最后一行 platform encoding: ANSI_X3.4-1968——默认 POSIX locale 下平台编码是 ASCII,源码含中文注释/字符串时需要显式处理,见 4.4 节与第九章 FAQ。
4.4 创建工程并引入依赖
建立一个标准 Maven 工程,pom.xml 中声明 commons-statistics-descriptive 依赖,并用 maven-shade-plugin 打成可直接运行的胖 jar(内嵌依赖,免去运行时手工拼 classpath)。
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 会自动下载它及其传递依赖到~/.m2/repository/org/apache/commons/。需要假设检验、置信区间、排名能力时,按第三章清单追加对应<dependency>即可。maven.compiler.release=17:按 JDK 17 语义编译;Commons Statistics 1.3 的字节码基线是 Java 8,若目标机器是 JDK 8 可改回8。project.build.sourceEncoding=UTF-8:源码含中文注释/字符串时必须声明,否则 4.3 节回显中的ANSI_X3.4-1968平台编码会按 ASCII 解码源码。maven-shade-plugin:把依赖的类打进最终 jar,Main-Class设为QuickStart,从而java -jar可独立运行。finalName:固定产物名称为statistics-install-demo.jar,避免带版本号后缀,方便脚本引用。
4.5 最小验证代码
验证程序 QuickStart.java(文件路径 /work/install-demo/src/main/java/QuickStart.java)覆盖 descriptive 模块最常用的两个统计量——均值与方差,体现「工厂方法全量计算」与「流式累积」两种入口并存的设计(Mean.of(data) 一次性计算,等价于 create() 后逐个 accept):
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。
4.6 编译与运行验证
以 Maven 打包并运行:
cd /work/install-demo && mvn -q -B package
echo "BUILD_EXIT=$?"
BUILD_EXIT=0
-q 静默模式下无输出即成功;本文实测首次构建耗时 5 分 02 秒(下载依赖与插件),之后增量构建在 10 秒内。查看产物:
ls -l target/*.jar
-rw-r--r-- 1 root root 194966 Oct 15 02:17 target/statistics-install-demo.jar
-rw-r--r-- 1 root root 2723 Oct 15 02:16 target/original-statistics-install-demo.jar
statistics-install-demo.jar(约 195 KB)是内嵌 descriptive 及其传递依赖的胖 jar,original-statistics-install-demo.jar 是不含依赖的原始 jar。
运行并观察完整回显:
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 已在 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(实测复现见 5.4 节)。
五、方案 B:官方 bin 包 + jar 直跑(离线友好)
本节面向没有 Maven/构建体系的场景,直接使用官方发布的 bin 包,用 javac + java 完成编译运行,不依赖任何构建工具。
5.1 方案说明
链路是:从 downloads.apache.org 下载官方 bin 包 → 校验 sha512 → 解压得到各模块 jar → 用 javac -cp 编译源码 → 用 java -cp 运行。适用于离线环境、脚本化部署或纯粹想「拿到 jar 就能用」的读者。
5.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:34 commons-statistics-1.3-bin.tar.gz
校验 sha512(期望值与实测值必须逐字一致):
echo "期望: $(cat commons-statistics-1.3-bin.tar.gz.sha512)"
echo "实测: $(sha512sum commons-statistics-1.3-bin.tar.gz | awk '{print $1}')"
期望: e49b6d8f20a23995e38f92b2635398adf08683f27b7045590dd3eb717eac6f4a9f02969b2ca52998afc178ad5547ae5fbb5784d4874fd8ffe2a99a86000767ff
实测: e49b6d8f20a23995e38f92b2635398adf08683f27b7045590dd3eb717eac6f4a9f02969b2ca52998afc178ad5547ae5fbb5784d4874fd8ffe2a99a86000767ff
⚠️ 注意:若 sha512 不一致,说明下载包损坏或被篡改,须删除后重新下载;切勿跳过校验直接使用。
5.3 解压
cd /work && tar xzf commons-statistics-1.3-bin.tar.gz && ls -l commons-statistics-1.3/
total 3784
-rw-r--r-- 1 root root 13001 Apr 27 00:00 LICENSE
-rw-r--r-- 1 root root 402 Apr 27 00:00 NOTICE
-rw-r--r-- 1 root root 7476 Apr 27 00:00 RELEASE-NOTES.txt
-rw-r--r-- 1 root root 878166 Apr 27 00:00 commons-statistics-descriptive-1.3-javadoc.jar
-rw-r--r-- 1 root root 157119 Apr 27 00:00 commons-statistics-descriptive-1.3-sources.jar
-rw------- 1 root root 126542 Apr 27 00:00 commons-statistics-descriptive-1.3.jar
-rw-r--r-- 1 root root 733809 Apr 27 00:00 commons-statistics-distribution-1.3-javadoc.jar
-rw-r--r-- 1 root root 107381 Apr 27 00:00 commons-statistics-distribution-1.3-sources.jar
-rw------- 1 root root 98884 Apr 27 00:00 commons-statistics-distribution-1.3.jar
-rw-r--r-- 1 root root 740860 Apr 27 00:00 commons-statistics-inference-1.3-javadoc.jar
-rw-r--r-- 1 root root 112379 Apr 27 00:00 commons-statistics-inference-1.3-sources.jar
-rw------- 1 root root 96112 Apr 27 00:00 commons-statistics-inference-1.3.jar
-rw-r--r-- 1 root root 339321 Apr 27 00:00 commons-statistics-interval-1.3-javadoc.jar
-rw-r--r-- 1 root root 14598 Apr 27 00:00 commons-statistics-interval-1.3-sources.jar
-rw------- 1 root root 19744 Apr 27 00:00 commons-statistics-interval-1.3.jar
-rw-r--r-- 1 root root 354291 Apr 27 00:00 commons-statistics-ranking-1.3-javadoc.jar
-rw-r--r-- 1 root root 16767 Apr 27 00:00 commons-statistics-ranking-1.3-sources.jar
-rw------- 1 root root 17993 Apr 27 00:00 commons-statistics-ranking-1.3.jar
bin 包内含 5 个功能模块(descriptive、distribution、inference、interval、ranking)各自的主 jar、javadoc 与 sources,外加 LICENSE、NOTICE 与 RELEASE-NOTES.txt。主 jar 为 commons-statistics-descriptive-1.3.jar(126542 字节)。
5.4 javac 编译与 java 运行
用官方 jar 作为编译与运行期 classpath:
mkdir -p /work/jar-run && cd /work/jar-run
cp /work/commons-statistics-1.3/commons-statistics-descriptive-1.3.jar .
cp /work/install-demo/src/main/java/QuickStart.java .
javac -encoding UTF-8 -cp commons-statistics-descriptive-1.3.jar -d out QuickStart.java
echo "JAVAC_EXIT=$?"
JAVAC_EXIT=0
先直接只用 descriptive jar 运行,观察会发生什么(实测踩坑):
java -cp out:commons-statistics-descriptive-1.3.jar QuickStart
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/numbers/core/Sum
at org.apache.commons.statistics.descriptive.FirstMoment.of(FirstMoment.java:156)
at org.apache.commons.statistics.descriptive.Mean.of(Mean.java:124)
at QuickStart.main(QuickStart.java:7)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.numbers.core.Sum
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoader.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
报错原因正是 4.6 节依赖树揭示的传递依赖:Mean.of 内部用到 commons-numbers-core 的 Sum 类,仅放 descriptive 一个 jar 到 classpath 不够。把两个 numbers jar 一并放入:
N=https://repo1.maven.org/maven2/org/apache/commons
cd /work/jar-run
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
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
验证点:classpath 补齐两个 numbers jar 后输出与方案 A 完全一致,说明 jar 直跑可用。其余模块(inference、interval、ranking、distribution)同理:ranking 与 interval 自身无 numbers 传递依赖,inference 则需追加 distribution、rng、numbers-fraction 等一组 jar,工程实践中建议直接用方案 A 省去手工拼 classpath。
5.5 Maven 中央仓库 jar 的独立获取(可选)
若只想从 Maven 中央仓库获取单个 jar 而不使用构建工具,可直接下载并校验 sha1:
cd /work/jar-run && curl -sO --max-time 60 https://repo1.maven.org/maven2/org/apache/commons/commons-statistics-descriptive/1.3/commons-statistics-descriptive-1.3.jar
curl -sO --max-time 30 https://repo1.maven.org/maven2/org/apache/commons/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
六、方案对比与选择建议
本节汇总两种方案的差异,给出选型建议。两种方案产出的是同一份 commons-statistics 1.3 代码,差别仅在获取与装配方式。
| 维度 | 方案 A:Maven 依赖 | 方案 B:官方 bin 包 + jar 直跑 |
|---|---|---|
| 运行期依赖 | Maven 自动解析(含 numbers 传递依赖) | 手工把 jar 放入 classpath,易漏 |
| 是否联网 | 首次构建需联网 | 仅下载时需要联网 |
| 依赖版本管控 | pom 统一声明,可锁版本 | 无,靠文件命名区分 |
| 多模块协同 | 声明对应模块即可,传递依赖自动处理 | 需手工收集全部 jar |
| 可复现产物 | mvn package 产出胖 jar | javac 产出 class + 引用 jar |
| 适用场景 | 常规工程开发 | 离线脚本、临时验证、无构建体系 |
选型建议:若项目有构建体系(Maven/Gradle),一律选方案 A,版本、传递依赖与打包全部自动化;若在无构建工具的老旧服务器上临时验证,或需要把 jar 手工嵌入既有脚本,选方案 B。两者也可共存——用方案 A 开发、用方案 B 分发 jar。
七、配置说明
本节说明 Commons Statistics 使用中真正需要设置的「配置」。它是库而非服务,没有独立配置文件,全部行为通过代码参数或 JDK 环境变量控制。
环境变量 JAVA_HOME(Maven 依赖它定位 JDK)。默认会话中该变量为空(实测回显):
echo "JAVA_HOME=$JAVA_HOME"
JAVA_HOME=
此时 Maven 仍能正常工作,是因为 apt 版 Maven 通过 PATH 中的 java(由 update-alternatives 指向 JDK 17,见 4.3 节 mvn -version 回显的 runtime 一行)完成 JDK 定位,不依赖 JAVA_HOME。若手工安装 JDK 或需要显式固定 JDK 路径,可显式导出(实测回显):
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 && echo "JAVA_HOME=$JAVA_HOME"
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
逐项说明:
JAVA_HOME:Maven 定位 JDK 的优先来源。Ubuntu 官方源的 Maven 自带兼容逻辑,JAVA_HOME为空时按PATH中的java定位(update-alternatives指向 17.0.20.1),实测无需手工设置即可构建;仅当手工安装 JDK 或 Maven 报「找不到 JDK」时,再按上面的方式显式导出该变量。- 代码级「参数」:统计量默认配置(如
Variance默认无偏、Median/Quantile默认不拷贝输入数组)均通过 API 链式方法(setBiased、withCopy等)控制,无外部配置文件。各 API 的完整行为见《Apache Commons Statistics 1.3 常用 API 与统计工具详解》。
八、多版本管理
多版本共存靠「隔离依赖坐标 + 隔离 jar 文件名」实现,无需切换全局软链。
Maven 本地仓库中不同版本的模块并列存放,互不覆盖(实时回显):
ls -1 $HOME/.m2/repository/org/apache/commons/commons-statistics-descriptive/
1.3
要点:工程要用哪个版本,只在 pom.xml 的 <dependency><version> 中改数字即可,其余版本仍留在本地仓库供其他工程复用。jar 直跑场景,把不同版本的 jar(如未来发布 1.4 时下载的 commons-statistics-descriptive-1.4.jar)分目录存放,运行时按需拼 classpath。
切换工程依赖版本并验证生效:
cd /work/install-demo && mvn -q -B dependency:tree 2>&1 | grep statistics-descriptive
[INFO] \- org.apache.commons:commons-statistics-descriptive:jar:1.3:compile
九、常见问题(FAQ)
Q1:编译或运行时中文变成问号或报 unmappable character?
4.3 节 mvn -version 回显显示默认 platform encoding: ANSI_X3.4-1968(POSIX locale 的 ASCII 编码)。编译期报 unmappable character for encoding ASCII 是 javac 按 ASCII 解码中文源码导致,修复:pom 设 project.build.sourceEncoding=UTF-8(本文 pom 已含)。运行期中文变问号,修复:java 命令加 -Dfile.encoding=UTF-8(本文运行命令已含),或把系统 locale 调成 UTF-8(export LANG=C.UTF-8)。
Q2:jar 直跑报 NoClassDefFoundError: org/apache/commons/numbers/core/Sum?
classpath 缺少传递依赖。commons-statistics-descriptive 1.3 依赖 commons-numbers-core:1.3 与 commons-numbers-arrays:1.3(4.6 节依赖树实测),Mean.of 等常用入口会触发 numbers 类加载。修复:把这两个 jar 加入 -cp(见 5.4 节完整命令),或改用方案 A 由 Maven 自动解析。
Q3:mvn package 报 Source option 5 is no longer supported 或插件要求更高 Maven 版本?
Maven 3.6.3 默认绑定的 compiler 插件是 3.1,不认识 maven.compiler.release 属性,会退回按 source/target=1.5 编译并被 JDK 17 拒绝。修复:pom 显式固定 maven-compiler-plugin 为 3.11.0(本文 pom 已含)。maven-shade-plugin 3.5.1 要求 Maven 3.2.5+,3.6.3 满足。
Q4:Mean.of(data) 与 Mean.create() 逐个 accept 结果会不一致吗?
不会。两者走同一套增量算法(of 内部就是创建后逐个 accept),本文 4.5 节验证程序输出 mean=7.0 variance=11.555555555555555 与手算一致。差异只在入口形态:of(double...) 适合一次性全量数组,create() + accept 适合流式/事件驱动累积。
Q5:commons-statistics 1.3 能不能跑在 JDK 8 上?
可以。官方 RELEASE-NOTES.txt 明确标注 Requires Java 8,其字节码基线为 Java 8;本文用 JDK 17 属于更高基线,兼容性不受影响。若编译目标机是 JDK 8,把 pom 的 maven.compiler.release 从 17 改为 8 即可。
十、卸载与清理
Commons Statistics 本身不产生系统级安装,卸载即移除依赖与本地文件。
移除验证工程与缓存文件(清理本文创建的所有产物):
rm -rf /work/install-demo /work/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 真正执行:
apt-get -s purge -y openjdk-17-jdk maven 2>&1 | tail -5
The following packages will be REMOVED:
maven* openjdk-17-jdk*
0 upgraded, 0 newly installed, 2 to remove and 2 not upgraded.
Purg maven [3.6.3-5]
Purg openjdk-17-jdk [17.0.20.1+1-1~22.04]
确认无误后真正卸载(实际生产环境执行):
apt-get purge -y openjdk-17-jdk maven && apt-get autoremove -y
十一、参考链接
- 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
- Commons Statistics Javadoc(各模块 API):https://commons.apache.org/proper/commons-statistics/
- Maven 中央仓库坐标页:https://repo1.maven.org/maven2/org/apache/commons/commons-statistics-descriptive/
- OpenJDK 17 安装包(Ubuntu 官方源):
apt-cache show openjdk-17-jdk