Apache Commons BSF 3.1 介绍与选型指南

Apache Commons BSF 3.1 的定位、两代脚本桥接 API、休眠状态说明与 JSR-223、GraalVM Polyglot 选型对比。

Apache Commons BSF2026/10/18

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.cgi2.4 与 3.1 的发行物
BSF 2.4 手册https://commons.apache.org/proper/commons-bsf/manual.htmlBSFManager 等 2.x API 用法
JSR-223 规范https://jcp.org/aboutJava/communityprocess/final/jsr223/index.html3.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.1JSR-223(javax.script)GraalVM Polyglot API
许可Apache-2.0JDK 的一部分(随各 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 + Bindingsorg.graalvm.polyglot.Context 多语言互操作,Native Image 友好
现状定位遗留系统标准但缺现代引擎(Nashorn 已于 JDK 15 移除,需配第三方引擎)当前多语言嵌入的主流选择

选型建议:维护依赖 BSF 的遗留代码时保持现有依赖并做好隔离;JDK 6+ 的新开发直接使用标准 JSR-223 并自行选择引擎;需要高性能多语言嵌入(JavaScript/Python/Ruby/WASM)、原生编译与持续维护,选 GraalVM Polyglot API。

八、参考链接