Apache Commons BSF 3.1 介绍与选型指南
Apache Commons BSF 3.1 的定位、两代脚本桥接 API、休眠状态说明与 JSR-223、GraalVM Polyglot 选型对比。
Apache Commons BSF 3.1 介绍与选型指南
目标:说清 Apache Commons BSF(Bean Scripting Framework)是什么、其历史最新版本与当前休眠状态、两代 API 的核心概念与工作方式、官方文档给出的最小使用示例,以及与 JDK 内置 JSR-223(javax.script)和 GraalVM Polyglot 的同类选型对比。本文为认知篇(A1):不做本地安装实测,全部版本号、特性与状态判断均来自官方来源联网查证,关键论断随文标注来源与查询日期(2026-10-18)。
一、信息基准
1.1 查询与版本基准
- 查询日期:2026-10-18,本文所有版本号、日期与状态判断均在该日联网核验。
- 基准版本:Apache Commons BSF 3.1,发布于 2010-06-24——这也是项目至今的末次发布。依据:Apache Commons 官网组件总表列明 BSF 最新 Release Version 为 3.1、Release Date 为 2010-06-24(来源:https://commons.apache.org/index.html );组件下载页同时提供 2.x 线的 2.4 与 3.x 线的 3.1 两个版本(来源:https://commons.apache.org/proper/commons-bsf/download_bsf.cgi )。
- 项目状态:休眠。组件官网页面显示 "Last Published: 17 Oct 2011 | Version: 2.5.0-SNAPSHOT"(来源:https://commons.apache.org/proper/commons-bsf/ ,查询日期 2026-10-18),即官网内容自 2011 年未再更新;自 2010-06-24 的 3.1 之后再无任何新版本发布。BSF 属于 Apache Commons Proper 中事实休眠的组件(2011-09 从 Jakarta 项目移入 Commons,来源:Jakarta 官网新闻存档 "11 September 2011 - BSF moves to Apache Commons")。
- 写作方式:不做本地安装实测;本文如实把 BSF 定位为"历史组件",供维护遗留系统者参考,不做新项目推荐。
1.2 官方来源清单
| 信息项 | 官方来源 URL | 用途 |
|---|---|---|
| 组件官网 | https://commons.apache.org/proper/commons-bsf/ | 定位、两代 API 说明、支持语言清单 |
| Commons 组件总表 | https://commons.apache.org/index.html | 最新版本(3.1)与发布日期(2010-06-24) |
| 下载页 | https://commons.apache.org/proper/commons-bsf/download_bsf.cgi | 2.4 与 3.1 的发行物 |
| BSF 2.4 手册 | https://commons.apache.org/proper/commons-bsf/manual.html | BSFManager 等 2.x API 用法 |
| JSR-223 规范 | https://jcp.org/aboutJava/communityprocess/final/jsr223/index.html | 3.x 所实现的脚本 API 规范 |
| GitHub 同步副本 | https://github.com/apache/commons-bsf | 源码浏览(开发主仓在 ASF GitBox) |
💡 说明:BSF 采用 Apache-2.0 许可(来源:GitHub 仓库许可字段,查询日期 2026-10-18)。
二、软件概述
2.1 定位与版本
Apache Commons BSF 3.1(2010-06-24 发布,末次发布)是一组 Java 类库,为 Java 应用提供脚本语言支持:既允许在 Java 应用中调用脚本语言引擎执行脚本,也允许脚本语言访问 Java 对象与方法。官网给出的原始应用场景包括:用 Java 之外的语言编写 JSP、让任意 Java 应用的一部分用内嵌语言实现或动态扩展(来源:组件官网首页定位描述,查询日期 2026-10-18)。
BSF 存在两代互不兼容的 API(官网原文):
- BSF 2.x(现行版本 2.4):使用源自 IBM 的原始 API(
BSFManager门面); - BSF 3.x(现行版本 3.1):使用 JSR-223(javax.script)定义的 API,并支持运行于 Java 1.4+,使 Java 1.4/1.5 也能获得 JSR-223 能力(历史上 JDK 6 才内置 javax.script)。
2.2 当前状态
项目处于长期休眠:末次发布 2010-06-24,官网页面 2011 年后未更新;GitHub 同步副本星标仅约 32(来源:GitHub API 实查,查询日期 2026-10-18)。JDK 6+ 已内置 javax.script,BSF 3.x 的"给老 JDK 补 JSR-223"价值随 JDK 升级而消失,这是项目失去维护动力的直接原因。
三、核心概念与工作方式
3.1 BSF 2.x:BSFManager 门面
BSF 2.x 以 BSFManager 为中心门面(依据官网手册 manual.html 的 API 结构):
BSFManager:管理脚本引擎注册与执行上下文;核心方法exec()(无返回执行)、eval()(求值返回)、apply()(调用函数)等,签名形如eval(String language, String source, int line, int column, Object script);- 语言引擎注册:通过
registerScriptingEngine()声明语言名与引擎实现类; - 对象注册表:官网定位描述中的 "object registry",把 Java 对象暴露给脚本引擎访问(如
declareBean())。
2.x 内置支持的语言(官网 Support Languages 清单):Rhino JavaScript、NetRexx、Commons JEXL、Jython(Python)、Jacl(Tcl)、Xalan/Xerces 的 XSLT;另有社区引擎接入 BeanShell、Groovy、JRuby 等。
3.2 BSF 3.x:JSR-223 实现
3.x 按 JSR-223(javax.script)实现脚本引擎发现与调用,并附带 XML 工具类与一个命令行工具用于测试 JSR-223 脚本(官网描述)。官网同时明确两点限制:一是 BSF 3.x 未通过 JSR-223 TCK,因此不能严格称为 JSR-223 兼容实现("believed to be complete");二是 BSF 本身不包含任何语言引擎,语言引擎必须单独引入 classpath——早期 3.0 曾内置引擎工厂,后续版本移除,因为多数语言已自带 JSR-223 工厂(官网原文)。
3.3 工作方式小结
无论 2.x 还是 3.x,BSF 的角色都是桥接层:Java 侧提供统一入口,脚本引擎侧按语言各自实现;数据交换通过对象注册表/Bindings 完成。引擎的可用性完全取决于 classpath 上是否存在对应语言 jar。
四、功能特性
以下特性均可在组件官网溯源(查询日期 2026-10-18):
- 统一脚本接入:一套 API 调用多种脚本语言,语言可热插拔(按 classpath 决定);
- 双向互操作:Java 调脚本(eval/exec/apply),脚本访问 Java 对象与方法;
- JSR-223 补齐(3.x):让 Java 1.4/1.5 获得 javax.script 能力,并提供命令行脚本测试工具;
- 对象注册表:向脚本安全地暴露选定的 Java Bean;
- 历史集成点:Apache Ant 的
<script>任务等老牌工具链历史上以 BSF 作为脚本桥接(以 Ant 官方手册为准)。
五、快速上手
以下示例依据官方 BSF 2.4 手册所载 API 结构(来源:https://commons.apache.org/proper/commons-bsf/manual.html ,查询日期 2026-10-18;本文不做本地实测)。
1. Maven 依赖(2.x 线;3.1 坐标同理换版本号):
<dependency>
<groupId>org.apache.bsf</groupId>
<artifactId>bsf</artifactId>
<version>2.4.0</version>
</dependency>
<!-- BSF 不含语言引擎,需另行引入 Rhino 等引擎 jar(官网说明) -->
<dependency>
<groupId>rhino</groupId>
<artifactId>js</artifactId>
<version>1.7R2</version>
</dependency>
2. 通过 BSFManager 求值脚本(2.x API,方法签名见官方手册):
import org.apache.bsf.BSFManager;
BSFManager manager = new BSFManager();
// 在 Java 中执行 JavaScript(依赖 classpath 上的 Rhino 引擎)
Object result = manager.eval("javascript", "(java source)", 1, 1, "1 + 2");
System.out.println(result); // 输出 3
3. BSF 3.x(JSR-223)用法:3.x 实现的是 javax.script 标准接口,编程入口为 javax.script.ScriptEngineManager(JDK 内置 API),BSF jar 提供老 JDK 上的引擎发现实现;运行方式与标准 JSR-223 代码一致。
⚠️ 注意:以上为历史 API 的认知示例,仅在维护依赖 BSF 的遗留项目时使用;新项目请参考第七章选型对比。
六、适用场景与限制
6.1 适用场景
- 遗留系统维护:仍依赖 BSFManager API 或 Apache Ant
<script>任务老版本行为的历史代码,理解与最小化适配; - JDK 1.4/1.5 的历史环境:BSF 3.x 曾经的定位(现代 JDK 已内置 javax.script,该场景已消失)。
6.2 限制与注意
- 休眠状态:末次发布 2010-06-24,无安全补丁、无现代 JDK 模块化适配,不建议用于任何新开发;
- 引擎自理:BSF 不含语言引擎,语言实现需自行引入并处理版本冲突(官网说明的引擎工厂移除原因);
- 规范符合性:BSF 3.x 未通过 JSR-223 TCK(官网声明);
- 安全边界:脚本执行缺乏现代沙箱能力,嵌入不可信脚本的风险由使用方自行控制。
七、同类选型对比
对比数据均于 2026-10-18 联网实查,来源:BSF(Commons 官网)、JSR-223(JCP 规范页与 JDK 文档)、GraalVM(graalvm.org 发布日历与 release notes、Oracle 官方公告)。
| 维度 | Apache Commons BSF 3.1 | JSR-223(javax.script) | GraalVM Polyglot API |
|---|---|---|---|
| 许可 | Apache-2.0 | JDK 的一部分(随各 JDK 许可) | GraalVM CE 开源;Oracle GraalVM 企业版为商业许可(graalvm.org) |
| 最新版本与发布 | 3.1,2010-06-24(Commons 组件总表) | JDK 6 起内置(java.scripting 模块),随 JDK 演进 | 25 LTS 基于 JDK 25(2025-09-16);25.2 发布于 2026-07(官方公告) |
| 版本节奏 | 已停更(休眠) | 随 JDK 半年节奏 | 有明确发布日历(release-calendar 页) |
| 社区活跃度 | GitHub 同步副本 32 stars,无活跃开发 | JDK 内置,引擎生态分散 | Oracle 团队维护,社区活跃(Graal 语言的官方入口) |
| 编程模型 | BSFManager(2.x)/JSR-223 实现(3.x) | 标准javax.script:ScriptEngineManager + Bindings | org.graalvm.polyglot.Context 多语言互操作,Native Image 友好 |
| 现状定位 | 遗留系统 | 标准但缺现代引擎(Nashorn 已于 JDK 15 移除,需配第三方引擎) | 当前多语言嵌入的主流选择 |
选型建议:维护依赖 BSF 的遗留代码时保持现有依赖并做好隔离;JDK 6+ 的新开发直接使用标准 JSR-223 并自行选择引擎;需要高性能多语言嵌入(JavaScript/Python/Ruby/WASM)、原生编译与持续维护,选 GraalVM Polyglot API。
八、参考链接
- 组件官网:https://commons.apache.org/proper/commons-bsf/
- BSF 2.4 手册:https://commons.apache.org/proper/commons-bsf/manual.html
- 下载页:https://commons.apache.org/proper/commons-bsf/download_bsf.cgi
- Commons 组件总表:https://commons.apache.org/index.html
- JSR-223 规范:https://jcp.org/aboutJava/communityprocess/final/jsr223/index.html
- GraalVM 官网与发布日历(对比项):https://www.graalvm.org/ 、https://www.graalvm.org/release-calendar/
- GitHub 同步副本:https://github.com/apache/commons-bsf