Apache Commons JCI 1.1 介绍与选型指南

Apache Commons JCI 1.1(2013-10 发布,休眠组件)选型指南:编译器统一接口、文件监控与热重载、官方示例,以及 Janino/JDK Compiler API/Eclipse JDT 的替代建议。

Apache Commons JCIApache Commons JCI2026/10/18

Apache Commons JCI 1.1 介绍与选型指南

目标:本文为认知篇(A1),基于 Apache Commons 官网、Maven Central 与 GitHub 仓库联网溯源编写,关键论断随文标注来源与查询日期(2026-10-18),不做本地安装实测。该组件已休眠(最后发版 2013 年),本文如实标注,选型前请重点阅读第七节。

一、信息基准

1.1 查询信息说明

  • 查询日期:2026-10-18(本文所有版本号、发布日期、社区数据均以该日联网实查为准)
  • 版本依据:Apache Commons JCI 官网组件页标注「Last Published: 14 October 2013 / Version: 1.1」(来源:commons.apache.org/proper/commons-jci/,查询日期 2026-10-18);Maven Central 实查 org.apache.commons:commons-jci-core 最新版本同为 1.1,入库时间 2013-10-09(search.maven.org,查询日期 2026-10-18)
  • 休眠判定:官网组件页与文档自 2013-10 起未更新,Maven Central 自 2013-10-09 后无新版本,属休眠组件

1.2 官方来源清单

来源地址
官网组件首页https://commons.apache.org/proper/commons-jci/
Usage(官方示例页)https://commons.apache.org/proper/commons-jci/usage.html
下载页https://commons.apache.org/proper/commons-jci/download_jci.cgi
Javadoc API 文档https://commons.apache.org/proper/commons-jci/apidocs/index.html
GitHub 仓库https://github.com/apache/commons-jci
Maven Centralartifact:org.apache.commons:commons-jci-core 等

1.3 版本基准表

项目值来源
本次介绍版本1.1官网组件页,2026-10-18 实查
发布日期2013-10(Maven Central 入库 2013-10-09;官网页面 2013-10-14)Maven Central / 官网
Java 要求官网现行页面未标注最低 Java 版本(组件最后发版于 2013 年,构建基线为当年 JDK 时代水平,兼容性需自行验证)官网下载页与组件页 2026-10-18 实查
许可证Apache License 2.0ASF 组件默认许可
维护状态休眠:约 13 年未发版,官网文档停更于 2013-10Maven Central / 官网,2026-10-18 实查

二、软件概述

Apache Commons JCI 1.1(2013-10 发布,Apache License 2.0)是 Apache Software Foundation 旗下的 Java 编译器接口库(官网原文:JCI is a java compiler interface)。它把「编译 Java 源码(或任何可编译为 Java class 的语言,如 Groovy、JavaScript)」抽象为统一 API,供应用在运行时调用;并与一个文件系统变更监控器(FilesystemAlterationMonitor)深度集成,可配合 JCI 的编译/重载类加载器实现源码变更后的自动编译与类热重载。官网同时说明:当前支持的全部编译器均具备内存编译能力(官网组件首页原文意译,查询日期 2026-10-18)。

休眠状态提示:该组件自 2013-10 的 1.1 后再无发版,官网文档亦停止更新;GitHub 仓库(apache/commons-jci)仍存在但无实质开发活动(2026-10-18 实查,22 stars)。新项目不应以其为核心依赖,仅建议存量系统维护者参考。

三、核心架构

3.1 组件分层

依据官网首页与 Usage 页(查询日期 2026-10-18):

  • 编译抽象层:JavaCompiler 接口统一编译入口,输入为源码路径、源码读取器(ResourceReader)与类输出存储(ResourceStore),输出 CompilationResult(含错误与警告,携带行号等信息);编译问题可通过 CompilationProblemHandler 在编译过程中即时回调。
  • 编译器实现层:按编译器分模块,官网列出的实现包括 Eclipse JDT 编译器、Janino、Groovy、Rhino(官网首页原文),对应 JavaCompilerFactory().createCompiler("eclipse") 等工厂用法。
  • 文件系统监控层:FilesystemAlterationMonitor 监听本地文件变化;挂接 ReloadingListener 或 CompilingListener 后可触发 ReloadingClassLoader 的类重载。
  • 类加载层:ReloadingClassLoader 包装父类加载器,实现变更类的重新载入。

3.2 Maven 模块划分

官网 Usage 页原文列出按编译器拆分的构件:commons-jci-eclipse、commons-jci-groovy、commons-jci-janino、commons-jci-rhino(另有 core 与 fam 等基础构件,见 Maven Central 实查)。使用 Eclipse 编译器需声明(来源:官网 Usage 页,查询日期 2026-10-18):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-jci-eclipse</artifactId>
    <version>1.1</version>
</dependency>

四、功能特性

依据官网首页与 Usage 页(查询日期 2026-10-18):

  1. 多编译器统一接口:同一套 JavaCompiler API 可切换 Eclipse JDT、Janino、Groovy、Rhino 等后端。
  2. 内存编译:所有受支持编译器均支持不落盘的内存编译(官网首页原文)。
  3. 编译结果结构化:CompilationResult 返回错误/警告数组,统一携带行号等定位信息;支持编译过程中的问题即时通知。
  4. 文件系统变更监控:FilesystemAlterationMonitor 对目录注册监听器,获得文件创建/变更/删除回调。
  5. 热重载类加载:ReloadingListener + ReloadingClassLoader 组合实现「源码变化 → 编译 → 类重载」闭环;也可仅实现 FilesystemAlterationListener 用于配置文件重载等轻量场景。
  6. 官方示例模块:提供 JSP Servlet 示例与类 javac 命令行示例(官网 Usage 页链接的 xref 示例)。

五、快速上手

以下两段代码均引自官方 Usage 页原文(来源:commons.apache.org/proper/commons-jci/usage.html,查询日期 2026-10-18)。

5.1 Maven 依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-jci-eclipse</artifactId>
    <version>1.1</version>
</dependency>

(来源:官网 Usage 页「Maven artifacts」节原文,查询日期 2026-10-18)

5.2 编译一段源码(官方原文示例)

JavaCompiler compiler = new JavaCompilerFactory().createCompiler("eclipse");
CompilationResult result = compiler.compile(sources,
        new FileResourceReader(sourceDir),
        new FileResourceStore(targetDir));

System.out.println( result.getErrors().length + " errors");
System.out.println( result.getWarnings().length + " warnings");

官网说明:错误行号等信息以一致方式提供;若编译器支持,还可在编译结束前通过 CompilationProblemHandler 收到错误通知。

5.3 文件系统监控与热重载(官方原文示例)

ReloadingClassLoader classloader = new ReloadingClassLoader(this.getClass().getClassLoader());
ReloadingListener listener = new ReloadingListener();

listener.addReloadNotificationListener(classloader);

FilesystemAlterationMonitor fam = new FilesystemAlterationMonitor();
fam.addListener(directory, listener);
fam.start();

💡 说明:以上为官方 Usage 页原样示例,本文未做本地运行实测;组件休眠多年,示例在新 JDK 上的可用性需自行验证。

六、适用场景与限制

6.1 适用场景(仅限存量系统)

  • 2013—2015 年代构建、已引入 JCI 的存量应用维护(如老式 JSP 热编译、规则脚本动态编译场景)。
  • 需要同时接入文件监控 + 编译 + 类重载三件套的遗留框架改造。

6.2 限制与注意

  • 休眠组件:约 13 年未发版(最后版本 1.1,2013-10),对新 JDK(模块化、类加载语义变化)的兼容性无官方承诺与验证。
  • 依赖陈旧:编译器后端绑定的是当年版本的 Eclipse JDT/Janino/Groovy/Rhino API,无法享受这些编译器后续的修复与性能改进。
  • 安全边界:动态编译与类重载本身即是高权限能力,集成不可信源码时需额外的沙箱措施(组件本身不提供)。
  • 官方无 Java 版本承诺:现行官网页面未标注最低/最高 Java 版本,升级 JDK 前必须实测。

七、同类选型对比

对比对象:Janino、JDK 内置 Compiler API(javax.tools)、Eclipse JDT ECJ。社区数据均为 2026-10-18 联网实查(GitHub API / Maven Central)。

维度Commons JCI 1.1Janino 3.1.12JDK Compiler API(javax.tools)Eclipse JDT(ECJ)
许可证Apache-2.0BSD-3-Clause(官方 LICENSE 文件实查)随 JDK 许可EPL-2.0(官方 README)
GitHub stars22(apache/commons-jci)1,329(janino-compiler/janino,仓库已归档 archived=true)不适用(JDK 自带)以 Eclipse 项目为准(projects.eclipse.org)
最近发版1.1(2013-10,Maven Central)3.1.12(Maven Central latest 实查;GitHub 最后 release v3.1.6 于 2021-07-29,仓库 2026-07 后归档)随 JDK 半年节奏随 Eclipse 年度节奏持续发版(org.eclipse.jdt:ecj)
版本节奏休眠(13 年无版本)停滞(仓库已归档)随 JDK活跃
兼容矩阵未标注(2013 年构建)Java 8+(3.x 线)JDK 6+跟随最新 JDK
能力侧重编译器无关抽象 + 文件监控 + 热重载超小体积嵌入式 Java 编译器(表达式/源码内存编译)标准 JSR 199 编译接口(配 javac 或注入 ECJ)完整 ECJ 编译器(IDE 级诊断)

选型建议:新项目一律不选 JCI;运行时动态编译首选 JDK 标准 javax.tools.JavaCompiler(可注入 ECJ 获得更好的诊断),轻量表达式/单类内存编译用 Janino(注意其仓库已归档,需评估锁定风险);仅当维护既有的 JCI 遗留系统时继续使用 1.1,并尽快制定迁移计划。

八、参考链接

  1. Apache Commons JCI 官网:https://commons.apache.org/proper/commons-jci/
  2. Usage(官方示例):https://commons.apache.org/proper/commons-jci/usage.html
  3. 下载页:https://commons.apache.org/proper/commons-jci/download_jci.cgi
  4. Javadoc:https://commons.apache.org/proper/commons-jci/apidocs/index.html
  5. GitHub 仓库:https://github.com/apache/commons-jci
  6. Janino 仓库:https://github.com/janino-compiler/janino
  7. Eclipse JDT Core 仓库:https://github.com/eclipse-jdt/eclipse.jdt.core
  8. JDK Compiler API(JSR 199):https://docs.oracle.com/javase/8/docs/api/javax/tools/JavaCompiler.html