CentOS 8 安装 Apache Commons BSF 指南
在 CentOS 8 上从零安装 Apache Commons BSF 2.4.0,覆盖 EOL 归档源修复、JDK 17 安装、Maven 3.5.4 显式 JAVA_HOME、Maven 依赖与官方 bin 包两种方案与卸载清理,命令回显均实测通过。
CentOS 8 安装 Apache Commons BSF 指南
目标:在 CentOS 8 上从零搭建 Apache Commons BSF 2.4.0 的开发与运行环境(OpenJDK 17 + Maven 3.5.4),重点解决 CentOS 8 已停止维护(EOL)后的软件源修复与 Maven 绑定 JDK 的坑,并跑通最小验证程序;本文全部命令与回显均已在 CentOS 8 实测通过。
Apache Commons BSF(Bean Scripting Framework)是 Apache Commons 旗下的多语言脚本框架,让 Java 程序通过统一的 BSFManager/BSFEngine 接口执行 JavaScript、Python(Jython)、BeanShell、XSLT 等脚本语言,并在 Java 对象与脚本变量之间共享数据。它是纯 Java 库,没有独立进程与常驻服务,安装的本质就是「修好软件源 → 装好 JDK/构建工具 → 引入 bsf.jar 与脚本引擎 jar → 写最小验证代码 → 编译运行」。CentOS 8 已于 2021 年底停止维护,官方镜像源下线,因此本文比 Ubuntu 场景多出「EOL 源修复」与「Maven 显式指定 JDK」两个关键步骤。
一、环境信息
本节先固定可复现的基线环境,后续所有命令均在此环境执行。
- 操作系统:CentOS Linux 8(
VERSION="8") - 架构:x86_64
- JDK:OpenJDK 17.0.1(dnf 包
java-17-openjdk-devel,版本1:17.0.1.0.12-2.el8_5) - 构建工具:Apache Maven 3.5.4(dnf 包
maven,版本1:3.5.4-5.module_el8.0.0+39+6a9b6e22) - 软件源:阿里云 centos-vault 归档(8.5.2111 快照)
- 组件版本:Apache Commons BSF 2.4.0(Maven 坐标
bsf:bsf:2.4.0) - 验证用工作目录:
/root/bsf-demo(Maven 工程)、/root/jar-run(jar 直跑)
系统与架构确认(实时回显):
cat /etc/os-release | head -4
NAME="CentOS Linux"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
uname -m
x86_64
💡 说明:BSF 是库而非服务,环境中不存在需要常驻的守护进程;「安装完成」的判定标准是可编译并运行一个调用其 API 的最小程序,而不是某个端口处于监听状态。
二、前置条件与 EOL 源现状确认
CentOS 8 的官方 mirrorlist 服务(mirrorlist.centos.org)已于 2024 年停服下线,未做任何配置的全新系统执行 dnf makecache 会直接失败。先如实复现这个现状,作为后续修复的依据。
dnf makecache 2>&1 | tail -5
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=container [Could not resolve host: mirrorlist.centos.org]
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: Curl error (6): Couldn't resolve host name for http://mirrorlist.centos.org/?release=8&arch=x86_64&infra=container [Could not resolve host: mirrorlist.centos.org]
java -version 2>&1 | head -1
bash: java: command not found
确认待满足的条件清单:
- 具有 root 或 sudo 权限的 CentOS 8 系统。
- 可访问阿里云归档镜像
mirrors.aliyun.com(修复源的唯一外部依赖)。 - 可访问 Maven 中央仓库
repo1.maven.org与 Apache 归档站archive.apache.org(下载 BSF 依赖与二进制包)。 - 至少 2 GB 可用磁盘空间(JDK + Maven + 依赖合计约 500 MB)。
外部站点连通性确认(实时回显):
curl -sI --max-time 15 https://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/x86_64/os/ | head -1
curl -sI --max-time 20 https://repo1.maven.org/maven2/bsf/bsf/2.4.0/bsf-2.4.0.jar | head -1
HTTP/2 200
HTTP/2 200
⚠️ 注意:centos-vault 的 8.5.2111 是阿里云保留的最后一个带完整 AppStream 的 8.x 快照之一,且从该快照起才有
java-17-openjdk包;选择更早的 8.x 快照会找不到 JDK 17,选择更新的快照部分目录已从 vault 移除。
三、修复 EOL 软件源(改用阿里云归档)
本节把 /etc/yum.repos.d/ 下三个启用中的仓库从失效的 mirrorlist 切换到阿里云 centos-vault 归档。修复对象是 BaseOS、AppStream、Extras 三个仓库,逐条执行(每条 sed 做两件事:注释掉失效的 mirrorlist= 行;解开 baseurl= 注释并把前缀换成 vault 地址)。
修复 BaseOS:
sed -i -e "s|mirrorlist=|#mirrorlist=|" -e "s|#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111|" /etc/yum.repos.d/CentOS-Linux-BaseOS.repo
修复 AppStream:
sed -i -e "s|mirrorlist=|#mirrorlist=|" -e "s|#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111|" /etc/yum.repos.d/CentOS-Linux-AppStream.repo
修复 Extras:
sed -i -e "s|mirrorlist=|#mirrorlist=|" -e "s|#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111|" /etc/yum.repos.d/CentOS-Linux-Extras.repo
核对修改结果(BaseOS 仓库的关键行,实时回显):
grep -E "baseurl=|#mirrorlist=" /etc/yum.repos.d/CentOS-Linux-BaseOS.repo
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/$basearch/os/
刷新缓存验证源可用(实时回显):
dnf makecache 2>&1 | tail -4
CentOS Linux 8 - AppStream 1.0 MB/s | 8.4 MB 00:08
CentOS Linux 8 - BaseOS 2.0 MB/s | 4.6 MB 00:02
CentOS Linux 8 - Extras 12 kB/s | 10 kB 00:00
Metadata cache created.
验证点:Metadata cache created. 出现且三个仓库均显示已下载的元数据大小,说明 EOL 源修复成功。GPG 校验沿用系统自带的 RPM-GPG-KEY-centos-official,无需修改。
四、版本选型说明
BSF 目前处于 Apache Commons 官网标注的 Dormant(休眠)维护状态:不再有活跃开发,也没有计划中的新版本。版本谱系与选型结论如下(与操作系统无关,取自 Maven Central 与 Apache 归档站的实时查询)。
| 版本线 | 最新版 | 发布时间 | Maven 坐标 | 说明 |
|---|---|---|---|---|
| 2.x(经典 API:BSFManager/BSFEngine) | 2.4.0 | 2006-10-06 | bsf:bsf:2.4.0 | Jakarta 时代最终版,Java 生态引用最广 |
| 3.x(JSR-223 风格:javax.script 早期实现) | 3.1 | 2010-06-24 | org.apache.bsf:bsf-api:3.1、org.apache.bsf:bsf-utils:3.1 | 只含 API 与工具,不含脚本引擎 |
| 更早 2.x | 2.3.0 / 2.2 | 2003 前 | bsf:bsf:2.3.0 等 | 仅历史兼容 |
关键差异与选型:2.4.0 与 3.1 的 API 完全不同——2.4.0 提供自成体系的 BSFManager 门面;3.1 的 bsf-api 内嵌的是一套 javax.script(JSR-223)接口副本,本身不含任何脚本引擎。实测 bsf-2.4.0.jar 的字节码主版本号为 46(即 Java 1.2),OpenJDK 8 与 OpenJDK 17 均可正常运行。本文实际采用 2.4.0,理由是它自带引擎注册机制、配套脚本引擎齐全、社区资料最多。Apache 归档站 binaries/ 目录的完整交付物为 bsf-bin-2.4.0.tar.gz、bsf-bin-2.4.0.zip、bsf-3.1-bin.tar.gz、bsf-3.1-bin.zip(另附各自 asc/md5/sha256 校验文件)。
版本号最终确认(程序内实测回显):
BSF version = 240.20061006
该值由 BSFManager.getVersion() 返回,240.20061006 即「2.4.0 版本、2006-10-06 构建」,与包内 RELEASE-NOTE.txt 记载一致。
五、方案 A:Maven 依赖安装(在线,推荐)
本节通过 dnf 安装 JDK 17 与 Maven,再用 Maven 坐标引入 bsf 依赖并跑通最小验证程序。CentOS 8 的 Maven 默认会绑定错误的 JDK,本节一并实测修复。
5.1 方案说明
方案 A 的链路是:dnf 安装 java-17-openjdk-devel 与 maven → 显式设置 JAVA_HOME 指向 JDK 17 → 在 pom.xml 中声明 bsf:bsf:2.4.0 与脚本引擎依赖 → Maven 自动下载并编译 → 运行验证程序。优点是版本由 pom 统一管控、依赖自动解析;缺点是首次构建需要联网。
5.2 安装 JDK 17 与 Maven
dnf install -y java-17-openjdk-devel maven
# 输出节选(实测首尾)
Installed:
java-17-openjdk-devel-1:17.0.1.0.12-2.el8_5.x86_64 maven-1:3.5.4-5.module_el8.0.0+39+6a9b6e22.noarch
Complete!
安装完成后先看默认状态(这里就是 CentOS 8 的第一个坑,实时回显):
mvn -version | head -4
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
Default locale: en_US, platform encoding: ANSI_X3.4-1968
⚠️ 注意:虽然刚装的是 JDK 17,Maven 3.5.4 却绑定到了系统里残留的 OpenJDK 1.8.0_312(dnf 安装 maven 时自动拉入的依赖)。原因是 el8 的 Maven 启动脚本优先探测
jre-1.8.0软链,不读 alternatives 的默认项。必须显式设置JAVA_HOME,否则后续编译行为不可控。
5.3 固定 java 命令并显式设置 JAVA_HOME
两步走:先让 java 命令本身指向 17(alternatives 修改默认项),再给 Maven 显式 JAVA_HOME:
update-alternatives --set java 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)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
mvn -version | head -4
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
Default locale: en_US, platform encoding: ANSI_X3.4-1968
验证点:Java version 一行变为 17.0.1,Maven 已绑定 JDK 17。持久化方法:把 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk 写入 /root/.bashrc 末尾(本文后续每条构建命令均在该变量已导出的会话中执行)。
5.4 创建工程并引入依赖
pom.xml(完整内容,文件路径 /root/bsf-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>bsf-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>bsf</groupId>
<artifactId>bsf</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>rhino</groupId>
<artifactId>js</artifactId>
<version>1.7R2</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>
逐项说明关键配置:
bsf:bsf:2.4.0:BSF 本体,Maven 自动解析其传递依赖commons-logging:1.0.4。rhino:js:1.7R2:BSF 内置 JavaScript 引擎的真实实现,缺失时运行报NoClassDefFoundError: org/mozilla/javascript/...。maven.compiler.release=17:JDK 17 编译;bsf.jar 自身是 major=46(Java 1.2)字节码,互不影响。maven-compiler-plugin显式固定 3.11.0:Maven 3.5.4 默认绑定的 compiler 插件更老,不认识maven.compiler.release属性,会按 source/target=1.5 编译被 JDK 17 拒绝。
验证程序 BsfVerify.java(文件路径 /root/bsf-demo/src/main/java/BsfVerify.java):
import org.apache.bsf.BSFEngine;
import org.apache.bsf.BSFManager;
public class BsfVerify {
public static void main(String[] args) throws Exception {
System.out.println("BSF version = " + BSFManager.getVersion());
BSFManager mgr = new BSFManager();
Object r1 = mgr.eval("javascript", "<inline>", 1, 1, "1 + 2 * 3");
System.out.println("eval '1 + 2 * 3' = " + r1 + " (" + r1.getClass().getName() + ")");
Object r2 = mgr.eval("javascript", "<inline>", 1, 1, "'Apache BSF'.toUpperCase()");
System.out.println("eval toUpperCase = " + r2);
mgr.declareBean("name", "CentOS 8", String.class);
Object r3 = mgr.eval("javascript", "<inline>", 1, 1, "'BSF on ' + name");
System.out.println("JS reads name = " + r3);
mgr.exec("javascript", "<inline>", 1, 1, "function add(a, b) { return a + b; }");
BSFEngine engine = mgr.loadScriptingEngine("javascript");
Object r4 = engine.call(null, "add", new Object[]{7, 35});
System.out.println("engine.call add = " + r4);
mgr.terminate();
System.out.println("BsfVerify OK");
}
}
程序要点:eval 的第 1 个参数是语言名(BSF 内置注册表中的 javascript),第 5 个参数是脚本内容本身;declareBean 把 Java 对象以变量名 name 注入脚本作用域;engine.call 按函数名调用脚本函数并传 Java 实参。各参数的完整语义见专栏第 4 篇。
5.5 编译与运行验证
编译(当前会话已 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk):
cd /root/bsf-demo && mvn -q compile && echo "EXIT=$?"
EXIT=0
运行:
R=~/.m2/repository
java -Dfile.encoding=UTF-8 -cp target/classes:$R/bsf/bsf/2.4.0/bsf-2.4.0.jar:$R/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar:$R/rhino/js/1.7R2/js-1.7R2.jar BsfVerify
BSF version = 240.20061006
eval '1 + 2 * 3' = 7 (java.lang.Integer)
eval toUpperCase = APACHE BSF
JS reads name = BSF on CentOS 8
engine.call add = 42.0
BsfVerify OK
结果解读:表达式求值返回 Integer 7;字符串大写正确;Java 侧注入的 name 在脚本里拼接成功;脚本函数 add(7, 35) 返回 42.0(Rhino 把数值统一映射为 Double)。五项输出全部符合预期,即表示 bsf 2.4.0 + rhino 1.7R2 已在 CentOS 8 + OpenJDK 17 上完整可用。
依赖树核对:
cd /root/bsf-demo && mvn -B dependency:tree | grep -E ":compile"
[INFO] +- bsf:bsf:jar:2.4.0:compile
[INFO] | \- commons-logging:commons-logging:jar:1.0.4:compile
[INFO] \- rhino:js:jar:1.7R2:compile
六、方案 B:官方 bin 包 + jar 直跑(离线友好)
本节直接使用 Apache 归档站发布的二进制包,用 javac + java 完成编译运行,不依赖任何构建工具。
6.1 方案说明
链路是:从 archive.apache.org 下载官方 bin 包 → 校验 sha256 → 解压得到 bsf.jar → 从中央仓库补齐引擎与日志 jar → 用 javac -cp 编译源码 → 用 java -cp 运行。适用于离线环境、脚本化部署或纯粹想「拿到 jar 就能用」的读者。
6.2 下载与完整性校验
cd /root
curl -sO --max-time 60 https://archive.apache.org/dist/commons/bsf/binaries/bsf-bin-2.4.0.tar.gz
curl -sO --max-time 30 https://archive.apache.org/dist/commons/bsf/binaries/bsf-bin-2.4.0.tar.gz.sha256
ls -l bsf-bin-2.4.0.tar.gz
-rw-r--r-- 1 root root 232413 Oct 15 05:52 bsf-bin-2.4.0.tar.gz
校验 sha256(期望值来自官方 .sha256 文件,实测值必须与之一致):
echo "期望: $(cat bsf-bin-2.4.0.tar.gz.sha256)"
echo "实测: $(sha256sum bsf-bin-2.4.0.tar.gz | awk '{print $1}')"
期望: 28bbd69c6218922a94ae0c2fcbf5a7bf2a8de5dabc849167687933e4c986c3d7 *./bsf/binaries/bsf-bin-2.4.0.tar.gz
实测: 28bbd69c6218922a94ae0c2fcbf5a7bf2a8de5dabc849167687933e4c986c3d7
⚠️ 注意:官方
.sha256文件末尾附带原始路径*./bsf/binaries/...,比对时只取前面 64 位十六进制摘要即可。若摘要不一致,须删除后重新下载。
6.3 解压与 jar 清单
tar xzf bsf-bin-2.4.0.tar.gz
ls bsf-2.4.0 | head -7
AUTHORS.txt
CHANGES.txt
INSTALL.txt
LICENSE.txt
NOTICE.txt
README.txt
RELEASE-NOTE.txt
包内 lib/ 目录只有一个主 jar(bsf.jar,113369 字节),samples/ 目录含 bsh、calc、scriptedui、xsl 四组官方示例:
ls -l bsf-2.4.0/lib/ && ls bsf-2.4.0/samples/
-rw-r--r-- 1 root root 113369 Oct 6 2006 bsf-2.4.0/lib/bsf.jar
bsh
calc
scriptedui
xsl
6.4 javac 编译与 java 运行
mkdir -p /root/jar-run && cd /root/jar-run
cp /root/bsf-2.4.0/lib/bsf.jar .
cp /root/bsf-demo/src/main/java/BsfVerify.java .
curl -sO --max-time 60 https://repo1.maven.org/maven2/rhino/js/1.7R2/js-1.7R2.jar
curl -sO --max-time 60 https://repo1.maven.org/maven2/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar
mkdir -p out
javac -encoding UTF-8 -cp bsf.jar -d out BsfVerify.java
⚠️ 注意:
javac -d指定的输出目录必须先存在(实测 CentOS 8 自带的 OpenJDK 17.0.1 javac 在目录不存在时直接报directory not found: out退出),所以上面先执行mkdir -p out再编译。
java -Dfile.encoding=UTF-8 -cp out:bsf.jar:js-1.7R2.jar:commons-logging-1.0.4.jar BsfVerify
BSF version = 240.20061006
eval '1 + 2 * 3' = 7 (java.lang.Integer)
eval toUpperCase = APACHE BSF
JS reads name = BSF on CentOS 8
engine.call add = 42.0
BsfVerify OK
验证点:java -cp 一行成功打印与方案 A 完全一致的结果,说明 jar 直跑可用。BSF 运行期 classpath 要求就是「bsf.jar + 目标语言引擎 jar + commons-logging.jar」三件套。
七、方案对比与选择建议
| 维度 | 方案 A:Maven 依赖 | 方案 B:官方 bin 包 + jar 直跑 |
|---|---|---|
| 运行期依赖 | Maven 自动解析(含 commons-logging) | 手工下载并拼 classpath |
| 是否联网 | 首次构建需联网 | 仅下载 jar 时需要联网 |
| 版本管控 | pom 统一声明,可锁版本 | 靠文件命名区分 |
| 引擎 jar 管理 | 依赖坐标自动传递 | 逐个手工下载 |
| 可复现产物 | mvn package 一键构建 | javac 逐文件编译 |
| 适用场景 | 常规工程开发 | 离线脚本、临时验证、无构建体系 |
选型建议:若项目有构建体系(Maven/Gradle),一律选方案 A,同时按 5.3 节把 JAVA_HOME 固化进 .bashrc;若在无构建工具的服务器上临时验证或手工嵌入既有部署脚本,选方案 B。两者也可共存——用方案 A 开发、用方案 B 分发 jar。
八、基础配置
本节说明 BSF 在 CentOS 8 上真正需要设置的「配置」。它是库而非服务,没有独立配置文件,全部行为通过 JVM 参数与代码参数控制。
1. JAVA_HOME(CentOS 8 必配项)。 el8 的 Maven 不读 alternatives 默认项,必须显式导出(见 5.3 节实测):
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
写入 /root/.bashrc 末尾后重新登录即对所有会话生效。检查是否生效:mvn -version 的 Java version 行应为 17.0.1。
2. 中文输出编码。 默认 locale 下 JVM 平台编码为 ANSI_X3.4-1968(见 5.3 节回显),System.out 打印中文会变问号。解决:运行命令统一加 -Dfile.encoding=UTF-8(本文所有 java 命令均已携带);或 export LANG=C.UTF-8。
3. JVM 堆参数。 BSF 脚本引擎的内存开销主要是引擎解释器与脚本作用域,常规用法 256 MB 堆足够。JVM 参数位置在 java 命令与 -cp 之间:
java -Xms256m -Xmx256m -Dfile.encoding=UTF-8 -cp out:bsf.jar:js-1.7R2.jar:commons-logging-1.0.4.jar BsfVerify
BSF version = 240.20061006
eval '1 + 2 * 3' = 7 (java.lang.Integer)
eval toUpperCase = APACHE BSF
JS reads name = BSF on CentOS 8
engine.call add = 42.0
BsfVerify OK
修改方法:-Xms 是初始堆、-Xmx 是最大堆,按需调大(如 -Xms512m -Xmx512m);系统级部署时写入 systemd unit 的 Environment=JAVA_OPTS=-Xms256m -Xmx256m(每行仅一个 Environment=)或启动脚本中拼接 java 启动参数的位置。长期运行大量脚本建议加 -XX:+HeapDumpOnOutOfMemoryError 便于排查。
九、常见问题(FAQ)
Q1:dnf makecache 或 dnf install 报 Curl error (6): Couldn't resolve host name ... mirrorlist.centos.org?
CentOS 8 官方 mirrorlist 服务已下线,全新系统必现。按第三章的 3 条 sed 修复(BaseOS/AppStream/Extras 逐条执行),切换到 mirrors.aliyun.com/centos-vault/8.5.2111 后 dnf makecache 即可恢复。部分内网环境改用其他 vault 镜像时,只替换域名、保留 /centos-vault/8.5.2111/ 路径结构即可。
Q2:dnf install java-17-openjdk-devel 找不到该包?
软件源快照太早。java-17-openjdk 从 CentOS 8.5 才进入 AppStream,vault 路径必须用 8.5.2111(本文实测包版本 1:17.0.1.0.12-2.el8_5)。用 dnf list available java-17-openjdk* 可确认源里是否已有该包。
Q3:装完 JDK 17,mvn -version 还是显示 Java version: 1.8.0_312?
el8 的 Maven 启动脚本优先探测 jre-1.8.0 软链且不读 alternatives 默认项,必须显式 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk(见 5.3 节实测对比回显)。只改 alternatives 不设 JAVA_HOME 时,java -version 是 17 而 Maven 仍用 8,两者互不影响,容易误判。
Q4:mvn compile 报 Source option 5 is no longer supported. Use 7 or later.?
Maven 3.5.4 默认绑定的 maven-compiler-plugin 版本过老,不认识 maven.compiler.release 属性,退回 source/target=1.5 编译被 JDK 17 拒绝。修复:pom 中显式固定 maven-compiler-plugin 3.11.0(见 5.4 节 pom 全文)。
Q5:运行 BSF 程序报 NoClassDefFoundError: org/mozilla/javascript/...?
classpath 缺 JavaScript 引擎实现,把 rhino:js:1.7R2(Maven)或 js-1.7R2.jar(jar 直跑)加入 classpath。
Q6:Jython 引擎启动时打印 *sys-package-mgr*: can't create package cache dir 警告?
Jython 尝试在自身 jar 同目录创建包缓存失败所致(不影响功能)。修复:运行命令加 -Dpython.cachedir=/tmp/jython-cache(目录需可写),实测警告消失。
Q7:中文输出显示为问号?
见第八章第 2 点:加 -Dfile.encoding=UTF-8,或 export LANG=C.UTF-8。
Q8:下载 archive.apache.org 速度慢或超时? 归档站带宽有限属正常现象,可在会话中配置代理:
export http_proxy=http://192.168.1.62:7897 https_proxy=http://192.168.1.62:7897
仅对当前会话生效,unset http_proxy https_proxy 清除;Maven 走代理则在 ~/.m2/settings.xml 的 <proxies> 段配置同地址。
十、卸载与清理
BSF 本身不产生系统级安装,卸载即移除依赖与本地文件。
移除工程、验证目录与 bin 包(实测回显):
rm -rf /root/bsf-demo /root/jar-run /root/bsf-2.4.0 /root/bsf-bin-2.4.0.tar.gz /root/bsf-bin-2.4.0.tar.gz.sha256
ls /root/bsf-demo 2>&1
ls: cannot access '/root/bsf-demo': No such file or directory
移除 Maven 本地仓库中的 BSF 相关构件(影响所有工程,慎用):
rm -rf $HOME/.m2/repository/bsf $HOME/.m2/repository/rhino $HOME/.m2/repository/org/python
卸载 JDK 与 Maven(仅当不再需要)。先以 --assumeno 预演确认将删除的包:
dnf remove java-17-openjdk-devel maven --assumeno 2>&1 | head -8
# 输出节选(实测首尾)
Dependencies resolved.
================================================================================================
Package Architecture 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
Operation aborted.
确认无误后真正卸载:
dnf remove -y java-17-openjdk-devel maven && dnf autoremove -y
十一、参考链接
- Apache Commons BSF 官方主页(Dormant 状态说明):https://commons.apache.org/bsf/
- Apache 归档站 BSF 二进制目录:https://archive.apache.org/dist/commons/bsf/binaries/
- Maven 中央仓库 bsf:bsf 坐标:https://repo1.maven.org/maven2/bsf/bsf/
- 阿里云 CentOS vault 归档说明:https://mirrors.aliyun.com/centos-vault/
- Rhino(JavaScript 引擎)Maven 坐标:https://repo1.maven.org/maven2/rhino/js/
- OpenJDK 17 包信息(CentOS 8 vault):
dnf list available java-17-openjdk*