CentOS 8 安装 Apache Commons BSF 指南

在 CentOS 8 上从零安装 Apache Commons BSF 2.4.0,覆盖 EOL 归档源修复、JDK 17 安装、Maven 3.5.4 显式 JAVA_HOME、Maven 依赖与官方 bin 包两种方案与卸载清理,命令回显均实测通过。

Apache Commons BSFApache Commons BSF2026/10/15

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

确认待满足的条件清单:

  1. 具有 root 或 sudo 权限的 CentOS 8 系统。
  2. 可访问阿里云归档镜像 mirrors.aliyun.com(修复源的唯一外部依赖)。
  3. 可访问 Maven 中央仓库 repo1.maven.org 与 Apache 归档站 archive.apache.org(下载 BSF 依赖与二进制包)。
  4. 至少 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.02006-10-06bsf:bsf:2.4.0Jakarta 时代最终版,Java 生态引用最广
3.x(JSR-223 风格:javax.script 早期实现)3.12010-06-24org.apache.bsf:bsf-api:3.1、org.apache.bsf:bsf-utils:3.1只含 API 与工具,不含脚本引擎
更早 2.x2.3.0 / 2.22003 前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

十一、参考链接

  1. Apache Commons BSF 官方主页(Dormant 状态说明):https://commons.apache.org/bsf/
  2. Apache 归档站 BSF 二进制目录:https://archive.apache.org/dist/commons/bsf/binaries/
  3. Maven 中央仓库 bsf:bsf 坐标:https://repo1.maven.org/maven2/bsf/bsf/
  4. 阿里云 CentOS vault 归档说明:https://mirrors.aliyun.com/centos-vault/
  5. Rhino(JavaScript 引擎)Maven 坐标:https://repo1.maven.org/maven2/rhino/js/
  6. OpenJDK 17 包信息(CentOS 8 vault):dnf list available java-17-openjdk*