Ubuntu 22.04 安装 Apache Commons RNG 指南

在 Ubuntu 22.04 上从零安装 Apache Commons RNG 1.7,覆盖 JDK 17 与 Maven 环境、五大模块坐标与选装建议、Maven 依赖与官方 bin 包两种方案、实例方法创建生成器的推荐写法、多版本管理与卸载,命令回显均实测通过。

Apache Commons RNGApache Commons RNG2026/10/15

Ubuntu 22.04 安装 Apache Commons RNG 指南

目标:在 Ubuntu 22.04 上从零搭建 Apache Commons RNG 1.7 的开发与运行环境(JDK 17 + Maven 3.6.3 + 官方依赖),并跑通随机源创建、基础取数与可复现性验证;本文全部命令与回显均已在 Ubuntu 22.04 实测通过。

Apache Commons RNG 是 Apache Commons 项目下的伪随机数生成器库,提供数十种纯 Java 实现的随机数生成算法(MersenneTwister、Xoshiro、PCG、LXM、Philox 等)以及一套分布采样器(高斯、指数、伽马、泊松、二项等)。它是纯 Java 库,没有独立进程与常驻服务,安装的本质就是「装好 JDK/构建工具 → 引入依赖 → 写最小验证代码 → 编译运行」。它是多模块项目,本文会先讲清模块划分再给出两种落地方式:面向开发的 Maven 依赖方案,以及面向无构建体系场景的官方 bin 包 + jar 直跑方案。

一、环境信息

本节先固定可复现的基线环境,后续所有命令均在此环境执行。列出操作系统、架构、JDK、构建工具与组件版本,便于读者对照复现。

  • 操作系统:Ubuntu 22.04.5 LTS(PRETTY_NAME="Ubuntu 22.04.5 LTS")
  • 架构:x86_64
  • JDK:OpenJDK 17.0.20.1(apt 包 openjdk-17-jdk)
  • 构建工具:Apache Maven 3.6.3
  • 组件版本:Apache Commons RNG 1.7(官网 downloads.apache.org 当前最新稳定版)
  • Maven 坐标:org.apache.commons:commons-rng-simple:1.7、org.apache.commons:commons-rng-sampling:1.7(传递引入 client-api 与 core)
  • 官方下载目录:https://downloads.apache.org/commons/rng/
  • 验证用工作目录:/root/rng-demo(Maven 工程)、/root/rng-jar-run(jar 直跑)

系统与架构确认(实时回显):

cat /etc/os-release | head -3
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
uname -m
x86_64

💡 说明:Commons RNG 是库而非服务,环境中不存在需要常驻的守护进程;「安装完成」的判定标准是可编译并运行一个调用其 API 的最小程序,而不是某个端口处于监听状态。

二、前置条件

本节说明安装前必须满足的条件。Ubuntu 22.04 自带可用的软件源,联网即可通过 apt 获取 JDK 与 Maven。

  1. 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
  2. 可访问 Ubuntu 官方软件源(apt update 能正常拉取索引)。
  3. 可访问 Apache 官方下载站 downloads.apache.org 与 Maven 中央仓库 repo1.maven.org(本文实测网络直连可达)。
  4. 至少 2 GB 可用磁盘空间(JDK + Maven + 依赖合计约 500 MB)。

网络连通性确认(实时回显):

curl -sI --max-time 20 https://downloads.apache.org/commons/rng/ | head -3
HTTP/1.1 200 OK
Date: Thu, 15 Oct 2026 03:01:06 GMT
Server: Apache
curl -sI --max-time 20 https://repo1.maven.org/maven2/org/apache/commons/commons-rng-simple/ | head -1
HTTP/2 200

三、版本选型说明

本节给出 Commons RNG 的版本谱系与模块清单。截至实测日期,官方下载目录 https://downloads.apache.org/commons/rng/binaries/ 上仅保留最新稳定版 1.7,历史版本在 https://archive.apache.org/dist/commons/rng/ 归档。binaries 目录实测内容如下:

curl -s --max-time 30 https://downloads.apache.org/commons/rng/binaries/ | grep -oE 'href="[^"]*"' | grep tar.gz
href="commons-rng-1.7-bin.tar.gz"
href="commons-rng-1.7-bin.tar.gz.asc"
href="commons-rng-1.7-bin.tar.gz.sha512"

版本线方面,1.x 是当前唯一在维护的大版本线,1.7 的官方发布说明明确「requires Java 8」,即字节码基线为 Java 8,JDK 8 及以上均可运行(本文字节码版本实测见第九章 FAQ Q5)。

Commons RNG 是多模块项目,选装前必须分清各模块职责。1.7 官方发布说明列出的库模块如下(均已实测存在于 Maven 中央仓库):

模块Maven 坐标职责是否需要直接依赖
client-apiorg.apache.commons:commons-rng-client-api:1.7面向应用的接口:UniformRandomProvider 及可跳/可分裂等扩展接口传递引入即可
coreorg.apache.commons:commons-rng-core:1.7各算法的内部实现否,官方明确不建议应用直接访问
simpleorg.apache.commons:commons-rng-simple:1.7RandomSource 枚举工厂,创建生成器的唯一推荐入口是(基础取数)
samplingorg.apache.commons:commons-rng-sampling:1.7分布采样器(高斯/指数/伽马/泊松/二项/Dirichlet 等)需要采样时加
bomorg.apache.commons:commons-rng-bom:1.7各模块版本对齐的 BOM 清单用 BOM 管版本时加

选装建议:只要基础随机数(nextInt/nextLong/nextDouble 等)只依赖 commons-rng-simple,它会自动带上 client-api 与 core;要按概率分布采样再加 commons-rng-sampling;多模块大工程希望锁版本,用 commons-rng-bom 配合 dependencyManagement。本文实际采用 1.7,理由是它是官网当前唯一在架的最新稳定版,且对 JDK 17 完全兼容。

四、方案 A:Maven 依赖安装(在线,推荐)

本节面向常规 Java 项目开发,通过 apt 安装 JDK 与 Maven,再用 Maven 坐标引入 Commons RNG 依赖并跑通最小验证程序。这是最贴合工程实践的方式。

4.1 方案说明

方案 A 的链路是:apt 安装 openjdk-17-jdk 与 maven → 在 pom.xml 中声明 commons-rng-simple 与 commons-rng-sampling 的 1.7 依赖 → Maven 自动从中央仓库下载 jar 到本地仓库 → 编译并运行验证程序。优点是版本由 pom 统一管控、依赖自动解析;缺点是首次构建需要联网。

4.2 安装 JDK 17

Ubuntu 22.04 官方源内置 openjdk-17-jdk,直接安装即可:

apt-get update -qq && apt-get install -y openjdk-17-jdk
# 输出节选(实测首尾)
The following additional packages will be installed:
  adwaita-icon-theme alsa-topology-conf alsa-ucm-conf at-spi2-core
  ca-certificates ca-certificates-java dbus dbus-user-session
1 upgraded, 224 newly installed, 0 to remove and 2 not upgraded.
Setting up openjdk-17-jdk:amd64 (17.0.20.1+1-1~22.04) ...

安装后确认版本:

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) ...
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

确认版本与 Maven 实际使用的 JDK:

mvn -version
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

验证点:Java version 一行显示 17.0.20.1,说明 Maven 已绑定到 JDK 17,无需额外设置 JAVA_HOME。

4.4 创建工程并引入依赖

建立一个标准 Maven 工程,pom.xml 中声明 Commons RNG 依赖,并用 maven-shade-plugin 打成可直接运行的胖 jar(内嵌 commons-rng 各模块,免去运行时手工拼 classpath)。

mkdir -p /root/rng-demo/src/main/java

pom.xml(完整内容,文件路径 /root/rng-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.rng</groupId>
  <artifactId>rng-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-rng-simple</artifactId>
      <version>1.7</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-rng-sampling</artifactId>
      <version>1.7</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>rng-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>RngCheck</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

逐项说明关键配置:

  • commons-rng-simple:1.7:创建生成器的入口模块(RandomSource 枚举所在),会传递引入 client-api 与 core 两个模块。
  • commons-rng-sampling:1.7:分布采样器模块,最小验证程序不直接用到,但一并引入后第五章的采样示例无需改 pom。
  • maven.compiler.release=17:按 JDK 17 语义编译;若目标机器是 JDK 8,可改回 8(Commons RNG 1.7 字节码基线即 Java 8)。
  • maven-compiler-plugin 显式固定 3.11.0:老版本 Maven 默认绑定的 compiler 插件较旧,显式固定可避免 Source option 5 is no longer supported 一类报错。
  • maven-shade-plugin:把 Commons RNG 的类打进最终 jar,Main-Class 设为 RngCheck,从而 java -jar 可独立运行;3.5.1 只要求 Maven 3.2.5+,Ubuntu 22.04 的 3.6.3 满足。

4.5 最小验证代码

验证程序 RngCheck.java(文件路径 /root/rng-demo/src/main/java/RngCheck.java)用 MersenneTwister 固定种子创建生成器,覆盖最常用的五个取数方法:

import org.apache.commons.rng.UniformRandomProvider;
import org.apache.commons.rng.simple.RandomSource;

public class RngCheck {
    public static void main(String[] args) {
        UniformRandomProvider rng = RandomSource.create(RandomSource.MT, 20261015L);
        System.out.println("provider     = " + rng.getClass().getName());
        System.out.println("nextInt()    = " + rng.nextInt());
        System.out.println("nextInt(100) = " + rng.nextInt(100));
        System.out.println("nextLong()   = " + rng.nextLong());
        System.out.println("nextDouble() = " + rng.nextDouble());
        System.out.println("nextBoolean()= " + rng.nextBoolean());
        System.out.println("Commons RNG OK");
    }
}

⚠️ 注意:静态工厂 RandomSource.create(RandomSource, seed) 在 1.7 已标记为过时(@Deprecated),官方推荐改用枚举实例方法 RandomSource.MT.create(20261015L),两者行为完全一致。本文 4.5 节保留静态写法以配合第九章 FAQ Q4 的实测讲解,新建代码请直接用实例方法写法:

UniformRandomProvider rng = RandomSource.MT.create(20261015L);

4.6 编译与运行验证

以 Maven 打包并运行:

cd /root/rng-demo && mvn -q -B package
ls -l target/*.jar
-rw-r--r-- 1 root root  2921 Oct 15 02:12 target/original-rng-demo.jar
-rw-r--r-- 1 root root 420019 Oct 15 02:12 target/rng-demo.jar

rng-demo.jar(约 420 KB)是内嵌 Commons RNG 各模块的胖 jar,original-rng-demo.jar 是不含依赖的原始 jar。

运行并观察完整回显:

java -Dfile.encoding=UTF-8 -jar target/rng-demo.jar
provider     = org.apache.commons.rng.core.source32.MersenneTwister
nextInt()    = 243253777
nextInt(100) = 79
nextLong()   = -7428464460000287899
nextDouble() = 0.86954735697081
nextBoolean()= true
Commons RNG OK

结果解读:provider 一行确认实际加载的是 core 模块里的 MersenneTwister 实现(应用代码只接触 simple 与 client-api,core 由库内部装配);五个取数方法全部返回数值且固定种子 20261015L 下每次运行结果完全相同,这正是固定种子可复现的预期行为。这表示 Commons RNG 1.7 已在 JDK 17 上完整可用。

💡 说明:-Dfile.encoding=UTF-8 用于 POSIX locale 下中文输出不乱码;本例输出全为 ASCII,可省略。RngCheck.java 因使用过时的静态 create,在 mvn package 非 -q 模式下会出现 Note: RngCheck.java uses or overrides a deprecated API 提示,属正常现象,含义与修法见第九章 FAQ Q4。

验证依赖确实来自中央仓库(实时回显):

ls -1 $HOME/.m2/repository/org/apache/commons/commons-rng-simple/1.7/
_remote.repositories
commons-rng-simple-1.7.jar
commons-rng-simple-1.7.jar.sha1
commons-rng-simple-1.7.pom
commons-rng-simple-1.7.pom.sha1

五、方案 B:官方 bin 包 + jar 直跑(离线友好)

本节面向没有 Maven/构建体系的场景,直接使用官方发布的 bin 包,用 javac + java 完成编译运行,不依赖任何构建工具。

5.1 方案说明

链路是:从 downloads.apache.org 下载官方 bin 包 → 校验 sha512 → 解压得到 client-api/core/simple/sampling 四个模块 jar → 用 javac -cp 编译源码 → 用 java -cp 运行。适用于离线环境、脚本化部署或纯粹想「拿到 jar 就能用」的读者。

5.2 下载与完整性校验

cd /root && curl -sO --max-time 120 https://downloads.apache.org/commons/rng/binaries/commons-rng-1.7-bin.tar.gz
curl -sO --max-time 30 https://downloads.apache.org/commons/rng/binaries/commons-rng-1.7-bin.tar.gz.sha512
ls -l commons-rng-1.7-bin.tar.gz
-rw-r--r-- 1 root root 3709031 Oct 15 02:13 commons-rng-1.7-bin.tar.gz

校验 sha512(期望值与实测值必须逐字一致):

echo "期望: $(cat commons-rng-1.7-bin.tar.gz.sha512)"
echo "实测: $(sha512sum commons-rng-1.7-bin.tar.gz | awk '{print $1}')"
期望: 9dec28282c9baf8b02f8a47fab2e74f5c2ec123dd7f62b25c1946cc2f25b3193d11b72ec40300a663f429c000840045bbeb0324556d4aadbb42e4387558e15e4
实测: 9dec28282c9baf8b02f8a47fab2e74f5c2ec123dd7f62b25c1946cc2f25b3193d11b72ec40300a663f429c000840045bbeb0324556d4aadbb42e4387558e15e4

⚠️ 注意:若 sha512 不一致,说明下载包损坏或被篡改,须删除后重新下载;切勿跳过校验直接使用。

5.3 解压

tar xzf commons-rng-1.7-bin.tar.gz && ls -l commons-rng-1.7/
total 4032
-rw-r--r-- 1 root root   15124 Apr 16 00:00 LICENSE
-rw-r--r-- 1 root root     172 Apr 16 00:00 NOTICE
-rw-r--r-- 1 root root   34012 Apr 16 00:00 RELEASE-NOTES.txt
-rw-r--r-- 1 root root  375806 Apr 16 00:00 commons-rng-client-api-1.7-javadoc.jar
-rw-r--r-- 1 root root   25287 Apr 16 00:00 commons-rng-client-api-1.7-sources.jar
-rw------- 1 root root   27941 Apr 16 00:00 commons-rng-client-api-1.7.jar
-rw-r--r-- 1 root root  980299 Apr 16 00:00 commons-rng-core-1.7-javadoc.jar
-rw-r--r-- 1 root root  177712 Apr 16 00:00 commons-rng-core-1.7-sources.jar
-rw------- 1 root root  126277 Apr 16 00:00 commons-rng-core-1.7.jar
-rw-r--r-- 1 root root 1239709 Apr 16 00:00 commons-rng-sampling-1.7-javadoc.jar
-rw-r--r-- 1 root root  207821 Apr 16 00:00 commons-rng-sampling-1.7-sources.jar
-rw------- 1 root root  231716 Apr 16 00:00 commons-rng-sampling-1.7.jar
-rw-r--r-- 1 root root  544646 Apr 16 00:00 commons-rng-simple-1.7-javadoc.jar
-rw-r--r-- 1 root root   57353 Apr 16 00:00 commons-rng-simple-1.7-sources.jar
-rw------- 1 root root   54241 Apr 16 00:00 commons-rng-simple-1.7.jar

bin 包内是四个功能模块的 jar 加上各自的 sources 与 javadoc,与 Maven 中央仓库交付物一一对应。

5.4 javac 编译与 java 运行

用官方 jar 作为编译与运行期 classpath(四个模块全部带上,缺一会报 NoClassDefFoundError,见 FAQ Q1):

mkdir -p /root/rng-jar-run && cd /root/rng-jar-run
B=/root/commons-rng-1.7
javac -encoding UTF-8 -cp $B/commons-rng-client-api-1.7.jar:$B/commons-rng-core-1.7.jar:$B/commons-rng-simple-1.7.jar:$B/commons-rng-sampling-1.7.jar -d out /root/rng-demo/src/main/java/RngCheck.java
Note: /root/rng-demo/src/main/java/RngCheck.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
java -Dfile.encoding=UTF-8 -cp out:$B/commons-rng-client-api-1.7.jar:$B/commons-rng-core-1.7.jar:$B/commons-rng-simple-1.7.jar:$B/commons-rng-sampling-1.7.jar RngCheck
provider     = org.apache.commons.rng.core.source32.MersenneTwister
nextInt()    = 243253777
nextInt(100) = 79
nextLong()   = -7428464460000287899
nextDouble() = 0.86954735697081
nextBoolean()= true
Commons RNG OK

验证点:java -cp 一行成功打印七行结果,且无 NoClassDefFoundError,说明 jar 直跑可用;deprecated API 提示的含义与修法见 FAQ Q4。

六、方案对比与选择建议

本节汇总两种方案的差异,给出选型建议。两种方案产出的是同一份 Commons RNG 1.7 代码,差别仅在获取与装配方式。

维度方案 A:Maven 依赖方案 B:官方 bin 包 + jar 直跑
运行期依赖Maven 自动解析四个模块手工把四个 jar 放入 classpath
是否联网首次构建需联网仅下载时需要联网
依赖版本管控pom 统一声明,可锁版本无,靠文件命名区分
模块间传递关系自动带上 client-api 与 core需手工收集全部模块 jar
可复现产物mvn package 产出胖 jarjavac 产出 class + 引用 jar
适用场景常规工程开发离线脚本、临时验证、无构建体系

选型建议:若项目有构建体系(Maven/Gradle),一律选方案 A,版本、传递依赖与打包全部自动化;若在无构建工具的老旧服务器上临时验证,或需要把 jar 手工嵌入既有脚本,选方案 B。两者也可共存——用方案 A 开发、用方案 B 分发 jar。

七、配置说明

本节说明 Commons RNG 使用中真正需要设置的「配置」。它是库而非服务,没有独立配置文件,全部行为通过代码参数或 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 在该变量为空时按 PATH 中的 java 定位(update-alternatives 指向 17.0.20.1),实测无需手工设置即可构建;仅当手工安装 JDK 或 Maven 报「找不到 JDK」时再显式导出。CentOS 8 上这一变量则是必设项,参见本专栏《CentOS 8 安装 Apache Commons RNG 指南》第九章。
  • 代码级「参数」:随机源算法选择(RandomSource 枚举,1.7 共 57 个枚举值)、种子类型(Long/Integer/int[]/byte[],固定种子可复现)、多线程策略(ThreadLocalRandomSource 或可分裂 provider 的 splits()),均通过 API 入参控制,无外部配置文件。各参数的实测行为见本专栏《Apache Commons RNG 1.7 常用 API 与随机源详解》。

八、多版本管理

Commons RNG 1.x 各版本 API 兼容(int/long 输出序列要求跨版本保持行为一致,见官方发布说明),因此多版本共存场景较少,主要服务于历史工程兼容。

Maven 本地仓库中不同版本的模块按目录并列存放,互不覆盖(实时回显,本机当前仅装 1.7):

ls -1 $HOME/.m2/repository/org/apache/commons/commons-rng-simple/
1.7

要点:工程要用哪个版本,只在 pom.xml 的 <dependency><version> 中改数字即可;历史版本 jar 从 https://archive.apache.org/dist/commons/rng/binaries/ 归档目录获取。jar 直跑场景,把不同版本的 jar 分目录存放,运行时按需拼 classpath。

切换工程依赖版本并验证生效:

cd /root/rng-demo && mvn -B dependency:tree | grep commons-rng
[INFO] +- org.apache.commons:commons-rng-simple:jar:1.7:compile
[INFO] |  +- org.apache.commons:commons-rng-client-api:jar:1.7:compile
[INFO] |  \- org.apache.commons:commons-rng-core:jar:1.7:compile
[INFO] \- org.apache.commons:commons-rng-sampling:jar:1.7:compile

依赖树验证了第三章的模块关系:simple 带出 client-api 与 core,sampling 独立平级,不依赖另外两个应用侧模块。

九、常见问题(FAQ)

Q1:运行时报 NoClassDefFoundError: org/apache/commons/rng/core/source32/JDKRandom 怎么办? 说明 classpath 缺 core 模块。Commons RNG 是多模块库:应用代码引用 simple(RandomSource 工厂)与 client-api(接口),但生成器实现都在 core 里,jar 直跑时四个模块 jar 必须齐全。实测复现(只放 simple 与 client-api 两个 jar):

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/rng/core/source32/JDKRandom
        at org.apache.commons.rng.simple.internal.ProviderBuilder$RandomSourceInternal.<clinit>(ProviderBuilder.java:142)
        at org.apache.commons.rng.simple.RandomSource.<clinit>(RandomSource.java:189)
        at RngCheck.main(RngCheck.java:6)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.rng.core.source32.JDKRandom

修复:把 commons-rng-core-1.7.jar 加入 -cp;Maven 工程无须关心,传递依赖自动处理。

Q2:mvn compile 报 Source option 5 is no longer supported. Use 7 or later. 怎么办? 说明 Maven 绑定的 compiler 插件过旧,不认识 maven.compiler.release 属性,退回按 source/target=1.5 编译。修复:按本文 4.4 节在 pom 的 <build><plugins> 中显式固定 maven-compiler-plugin 3.11.0。老版本 Maven(如 CentOS 8 自带的 3.5.4)上同样适用。

Q3:中文输出显示为乱码(问号)? 默认 POSIX locale 下 JVM 会用 ASCII 输出中文。解决:运行时加 -Dfile.encoding=UTF-8,或把系统 locale 调成 UTF-8(export LANG=C.UTF-8);Maven 编译含中文的源码时由 pom 的 project.build.sourceEncoding=UTF-8 兜底(本文 pom 已配置)。

Q4:编译出现 Note: RngCheck.java uses or overrides a deprecated API,用到了什么过时 API? 是静态工厂 RandomSource.create(RandomSource, Object, Object...),1.7 源码中该重载标记为 @Deprecated,官方推荐改用枚举实例方法 create() 与 create(Object seed)。用 -Xlint:deprecation 实测定位:

/root/rng-demo/src/main/java/RngCheck.java:6: warning: [deprecation] create(RandomSource,Object,Object...) in RandomSource has been deprecated
        UniformRandomProvider rng = RandomSource.create(RandomSource.MT, 20261015L);
                                                ^
1 warning

修复:改为 RandomSource.MT.create(20261015L)。实测两种写法在相同种子下输出完全一致(首个 nextInt 均为 243253777),迁移无行为风险。

Q5:Commons RNG 1.7 能不能跑在 JDK 8 上? 可以。实测 client-api jar 字节码主版本号(实时回显):

javap -verbose -cp $HOME/.m2/repository/org/apache/commons/commons-rng-client-api/1.7/commons-rng-client-api-1.7.jar org.apache.commons.rng.UniformRandomProvider | grep major
  major version: 52

major 52 即 Java 8,四个模块同基线,JDK 8 及以上均可运行;本文用 JDK 17 属于更高基线,兼容性不受影响。

Q6:RandomSource.TWO_CMRES_SELECT.create() 报 IllegalArgumentException: wrong number of arguments? TWO_CMRES_SELECT 是 TwoCmres 算法的「自选子循环」变体,必须显式传入两个子周期选择参数(如 create(26219, 6, 9) 形式的种子加参数),不能像其他 55 个枚举值那样无参创建。普通用途直接用 TWO_CMRES 即可。

十、卸载与清理

Commons RNG 本身不产生系统级安装,卸载即移除依赖与本地文件。

移除 Maven 工程与 jar 直跑目录(清理本文创建的全部产物):

rm -rf /root/rng-demo /root/rng-jar-run /root/commons-rng-1.7 /root/commons-rng-1.7-bin.tar.gz /root/commons-rng-1.7-bin.tar.gz.sha512
ls /root/rng-demo 2>&1
ls: cannot access '/root/rng-demo': No such file or directory

移除 Maven 本地仓库中的 Commons RNG(影响所有工程,慎用):

rm -rf $HOME/.m2/repository/org/apache/commons/commons-rng-client-api $HOME/.m2/repository/org/apache/commons/commons-rng-core $HOME/.m2/repository/org/apache/commons/commons-rng-simple $HOME/.m2/repository/org/apache/commons/commons-rng-sampling $HOME/.m2/repository/org/apache/commons/commons-rng-bom

卸载 JDK 与 Maven(仅当不再需要)。先以 -s 预演确认将删除的包,无误后去掉 -s 真正执行:

apt-get -s purge -y openjdk-17-jdk maven
# 输出节选(实测首尾)
The following packages will be REMOVED:
  maven* openjdk-17-jdk*
0 upgraded, 0 newly installed, 2 to remove and 1 not upgraded.
Remv maven [3.6.3-5]
Remv openjdk-17-jdk [17.0.20.1+1-1~22.04]

确认无误后真正卸载:

apt-get purge -y openjdk-17-jdk maven && apt-get autoremove -y

十一、参考链接

  1. Apache Commons RNG 官方主页:https://commons.apache.org/proper/commons-rng/
  2. Apache Commons RNG 官方下载目录:https://downloads.apache.org/commons/rng/
  3. Commons RNG 1.7 发布说明:https://downloads.apache.org/commons/rng/RELEASE-NOTES.txt
  4. Commons RNG Javadoc(UniformRandomProvider/RandomSource/Sampler):https://commons.apache.org/proper/commons-rng/userguide/rng-userguide.html
  5. Maven 中央仓库 commons-rng 坐标:https://repo1.maven.org/maven2/org/apache/commons/commons-rng-simple/
  6. OpenJDK 17 安装包(Ubuntu 官方源):apt-cache show openjdk-17-jdk