Apache Commons Jexl 3.7.0 介绍与选型指南

Apache Commons JEXL 3.7.0 表达式语言引擎认知篇:定位与许可、核心架构、3.7.0 安全默认值变化、官方示例快速上手与 SpEL/MVEL/Aviator 选型对比。

Apache Commons JexlApache Commons Jexl2026/10/18

Apache Commons Jexl 3.7.0 介绍与选型指南

一、信息基准

二、软件概述

2.1 基本信息

项目内容
最新稳定版3.7.0(2026-06-28 官网发布页,Central 元数据 2026-07-02 更新)
Java 要求Java 8 及以上(构建配置 maven.compiler.source/target=1.8,来源:Maven Central commons-jexl3-3.7.0.pom)
许可证Apache License, Version 2.0(来源:官方组件页 License 链接)
Maven 坐标org.apache.commons:commons-jexl3:3.7.0
源码仓库Apache GitBox / GitHub apache/commons-jexl(同步副本)
所属生态Apache Commons 组件家族(JEXL 为独立表达式语言组件,非运行时框架)

2.2 定位与背景

JEXL(Java Expression Language)是 Apache Commons 旗下用于在 Java 应用中嵌入"表达式求值"能力的库:应用把一段文本表达式交给引擎,引擎在给定的上下文对象上完成取值、方法调用与运算。其语法沿袭自 Velocity/JSP-EL 风格,同时扩展出脚本级特性(循环、lambda、函数定义、switch 等,随版本演进)。官方首页明确提供了脚本与流的集成示例(如官方 StreamTest 示例演示"将 JEXL lambda 用作 Stream mapper"),说明其定位介于"轻量表达式求值器"与"嵌入式脚本引擎"之间。(来源:commons.apache.org/proper/commons-jexl/,查询日期 2026-10-18)

3.7.0 是一次以"安全默认值"为主题的版本:官方发布公告明确"Version 3.7.0 is source and binary compatible with 3.6.x but it changes default runtime and parse-time behavior"。升级评估时应把默认行为变化(见 4.1)作为第一件事核对。(来源:官方组件页 Compatibility 章节,查询日期 2026-10-18)

三、核心架构

3.1 引擎构建链:JexlBuilder → JexlEngine

官方示例统一通过 JexlBuilder 构造 JexlEngine,并在构造时注入两类关键配置:

  • JexlFeatures:控制表达式/脚本可使用的语法特性(循环、副作用、pragma、注解等);
  • JexlPermissions:控制脚本可反射访问的包/类/成员白名单。

官方首页 StreamTest 示例原文(节选):

// Restricting features; no loops, no side effects
JexlFeatures features = new JexlFeatures()
    .loops(false)
    .sideEffectGlobal(false)
    .sideEffect(false);
// Restricted permissions to a safe set but with URI allowed
JexlPermissions permissions = new ClassPermissions(java.net.URI.class);
// Create the engine
jexl = new JexlBuilder().features(features).permissions(permissions).create();

(来源:commons.apache.org/proper/commons-jexl/ 首页示例,查询日期 2026-10-18)

3.2 求值上下文与产物

  • JexlContext(常用 MapContext):向表达式提供变量;
  • 求值产物为 JexlExpression(单表达式)与 JexlScript(含语句的脚本),由 JexlEngine.createExpression/createScript 获得;
  • JexlArithmetic:数值运算语义(含 BigInteger/BigDecimal 处理);
  • JexlScriptEngine:JSR-223(javax.script)适配入口;
  • JexlConfigLoader(3.7.0 新增):从 YAML 文件装载引擎配置(权限、特性、命名空间)。(来源:官方 3.7.0 发布说明 New Features 表,查询日期 2026-10-18)

3.3 权限模型

3.7.0 的默认权限为 JexlPermissions.SECURE——官方描述为"仅覆盖安全 java.lang 值类型、java.math 与 java.util 的最小白名单,其余(系统类、I/O、反射等)一律拒绝,除非显式并入"。此前(3.3 起)默认为 RESTRICTED;RESTRICTED 本身在 3.6.x/3.7.0 也被加固:"仅当类自身的包或类被显式允许才可访问",取消了"父类型在白名单即放行子类"的 reach-through 行为。权限 DSL 还支持对允许类内的个别成员做拒绝,官方示例:"java.util +{ -Formatter { Formatter(); } }"。(来源:官方组件页 relnotes.html,查询日期 2026-10-18)

四、功能特性

4.1 安全默认值(3.7.0 核心变化)

官方列出 3.7.0 两个默认变化:

  • 默认权限变为 SECURE(见 3.3);
  • 默认特性集禁用 new(...)、全局副作用、pragma 与注解,并启用词法作用域;循环仍对脚本可用(对表达式始终不可用)。使用被禁结构的脚本将在解析期抛出 JexlException.Feature。

迁移路径(官方推荐):加载随包发布的 jexl.yaml 恢复 RESTRICTED 权限并启用 new、循环、副作用与 lambda(与 3.6 默认一致),官方原文示例:

try (InputStream in = getClass().getResourceAsStream("/jexl.yaml")) {
    JexlEngine engine = JexlConfigLoader.load(in).create();
}

也可用 JexlBuilder.setDefaultPermissions / setDefaultFeatures / setDefaultOptions 进程级恢复旧默认(JexlBuilder.FULL 为 3.7 前的特性集)。(来源:官方组件页 Compatibility 与 relnotes.html,查询日期 2026-10-18)

4.2 语言能力

  • 表达式与脚本两级求值,支持方法调用、下标、Map/数组字面量、三目运算、字符串插值;
  • lambda 与函数定义、switch 语句/表达式(3.6.0 引入,JEXL-440);
  • 与 Java Stream 协作的映射 lambda 用法(官方 StreamTest 示例演示 JEXL lambda 作为 Stream mapper);
  • 模板能力(Template/模板表达式)。(来源:官方组件页与 relnotes.html,查询日期 2026-10-18)

4.3 诊断与迁移工具

  • JexlPermissions.logging()(3.7.0 新增):包装权限集后把每条 allow/deny 决策记录一次,官方推荐用于迁移期发现被新 SECURE 权限拒绝的反射元素;
  • 引擎可配置 strict/safe/cancellable 等运行时求值选项(JexlBuilder.setDefaultOptions)。(来源:官方 relnotes.html,查询日期 2026-10-18)

五、快速上手

说明:本篇为 A1 认知篇,以下内容引自官方文档与发布页原文并标注来源,未做本地运行实测。

5.1 Maven 依赖

官方组件页"Release Information"要求通过构建工具拉取,坐标以 Maven Central 元数据为准(来源:repo1.maven.org/maven2/org/apache/commons/commons-jexl3/,查询日期 2026-10-18):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-jexl3</artifactId>
    <version>3.7.0</version>
</dependency>

5.2 创建引擎(官方原文示例)

迁移期最省事的方式是加载官方随包提供的 jexl.yaml(恢复 3.6 行为;来源:官方组件页 Compatibility 章节,查询日期 2026-10-18):

try (InputStream in = getClass().getResourceAsStream("/jexl.yaml")) {
    JexlEngine engine = JexlConfigLoader.load(in).create();
}

5.3 受控引擎(官方首页示例原文)

// Restricting features; no loops, no side effects
JexlFeatures features = new JexlFeatures()
    .loops(false)
    .sideEffectGlobal(false)
    .sideEffect(false);
// Restricted permissions to a safe set but with URI allowed
JexlPermissions permissions = new ClassPermissions(java.net.URI.class);
// Create the engine
jexl = new JexlBuilder().features(features).permissions(permissions).create();

(来源:https://commons.apache.org/proper/commons-jexl/ 首页示例,查询日期 2026-10-18)

六、适用场景与限制

6.1 适用场景

  • 业务规则/风控/告警等"表达式外置"场景:把运算式放在配置或规则文件中,由 JEXL 在运行期对上下文求值;
  • 需要"表达式 + 少量脚本语句(循环、函数)"的轻量嵌入脚本场景;
  • 需要模板渲染(Template)或 JSR-223 脚本引擎接入的场景;
  • 对求值能力需要强沙盒管控的场景(JexlFeatures + JexlPermissions + 权限 DSL)。

6.2 限制与注意

  • 3.7.0 默认收紧:禁 new()/全局副作用/pragma/注解、默认 SECURE 权限,旧脚本可能解析期即抛 JexlException.Feature,升级必须先跑官方迁移建议(jexl.yaml 或显式恢复默认);
  • 权限/特性配置错误可能导致脚本能力缺失或过宽,需结合 JexlPermissions.logging() 审计;
  • 表达式语义丰富意味着语法面大,配置文件中的表达式应经过校验与测试。

七、同类选型对比

7.1 对比表

组件许可证社区活跃度(GitHub stars + 最近发版)版本节奏兼容矩阵
Apache Commons JEXL 3.7.0Apache-2.0apache/commons-jexl(GitHub 同步副本);官网 2026-06-28 发布 3.7.03.6.0→3.6.4→3.7.0,近一年多次维护发版(Central 元数据 3.6.x 连续 4 个补丁后接 3.7.0)Java 8+;3.7.0 与 3.6.x 源码/二进制兼容但默认行为变化
Spring SpEL(spring-expression)Apache-2.0spring-projects/spring-framework 约 53,053 stars(GitHub API 检索)最新 Central 检索条目 7.0.0-M6(2025-06 时间戳),累计 262 个版本(Maven Central 检索)随 Spring Framework 6.x/7.x;Java 17+ 为 6.x 起官方基线
MVEL(mvel2)Apache-2.0mvel/mvel 约 1,204 stars,仓库最近推送 2026-10-14(GitHub API 检索)最新 2.5.2.Final(2024-01,Central 检索)Java 8+ 兼容,历史长期被规则引擎/工作流引擎内嵌
Aviator(aviatorscript)GitHub API license 字段未标注killme2008/aviatorscript 约 5,246 stars,最近推送 2026-07-27(GitHub API 检索)最新 5.4.3(2024-06,Central 检索)主打编译为字节码的高性能求值,Java 8+

(来源:各组件官方仓库 GitHub API 与 Maven Central 检索,查询日期 2026-10-18)

7.2 选型建议

一句话:Spring 技术栈内求值需求直接用 SpEL 免引入新依赖;追求高性能、语法面小的纯表达式求值选 Aviator;需要"表达式+脚本语句+模板+细粒度沙盒"的嵌入式引擎选 JEXL 3.7.0(注意默认安全收紧);与 Drools 等历史规则生态对接或迁移旧系统时再考虑 MVEL。

八、参考链接

  1. 组件首页:https://commons.apache.org/proper/commons-jexl/
  2. 发布说明:https://commons.apache.org/proper/commons-jexl/relnotes.html
  3. 下载页:https://commons.apache.org/proper/commons-jexl/download_jexl.cgi
  4. Javadoc:https://commons.apache.org/proper/commons-jexl/apidocs/index.html
  5. JexlConfigLoader Javadoc:https://commons.apache.org/proper/commons-jexl/apidocs/org/apache/commons/jexl3/JexlConfigLoader.html
  6. JexlPermissions Javadoc:https://commons.apache.org/proper/commons-jexl/apidocs/org/apache/commons/jexl3/introspection/JexlPermissions.html
  7. Maven Central 元数据:https://repo1.maven.org/maven2/org/apache/commons/commons-jexl3/maven-metadata.xml
  8. GitHub 仓库(同步副本):https://github.com/apache/commons-jexl