Apache Commons JCI 1.1 介绍与选型指南
Apache Commons JCI 1.1(2013-10 发布,休眠组件)选型指南:编译器统一接口、文件监控与热重载、官方示例,以及 Janino/JDK Compiler API/Eclipse JDT 的替代建议。
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 Central | artifact: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.0 | ASF 组件默认许可 |
| 维护状态 | 休眠:约 13 年未发版,官网文档停更于 2013-10 | Maven 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):
- 多编译器统一接口:同一套
JavaCompilerAPI 可切换 Eclipse JDT、Janino、Groovy、Rhino 等后端。 - 内存编译:所有受支持编译器均支持不落盘的内存编译(官网首页原文)。
- 编译结果结构化:
CompilationResult返回错误/警告数组,统一携带行号等定位信息;支持编译过程中的问题即时通知。 - 文件系统变更监控:
FilesystemAlterationMonitor对目录注册监听器,获得文件创建/变更/删除回调。 - 热重载类加载:
ReloadingListener+ReloadingClassLoader组合实现「源码变化 → 编译 → 类重载」闭环;也可仅实现FilesystemAlterationListener用于配置文件重载等轻量场景。 - 官方示例模块:提供 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.1 | Janino 3.1.12 | JDK Compiler API(javax.tools) | Eclipse JDT(ECJ) |
|---|---|---|---|---|
| 许可证 | Apache-2.0 | BSD-3-Clause(官方 LICENSE 文件实查) | 随 JDK 许可 | EPL-2.0(官方 README) |
| GitHub stars | 22(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,并尽快制定迁移计划。
八、参考链接
- Apache Commons JCI 官网: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:https://commons.apache.org/proper/commons-jci/apidocs/index.html
- GitHub 仓库:https://github.com/apache/commons-jci
- Janino 仓库:https://github.com/janino-compiler/janino
- Eclipse JDT Core 仓库:https://github.com/eclipse-jdt/eclipse.jdt.core
- JDK Compiler API(JSR 199):https://docs.oracle.com/javase/8/docs/api/javax/tools/JavaCompiler.html