Apache XML Commons Resolver 1.2 介绍与选型指南
Apache XML Commons Resolver 1.2 介绍与选型指南:OASIS XML Catalogs 实体解析器、CatalogManager 与 CatalogResolver 集成方式、2006 末版的低活跃现状,及与 libxml2、Xerces-J、Xerces-C 的量化选型对比。
Apache XML Commons Resolver 1.2 介绍与选型指南
一、信息基准
本章列明本文事实性信息的核查时间与来源,全部信息取自 Apache XML Commons 官方渠道与公开发行目录,不含本地实测推算。本项目长期处于低活跃状态,本文按"最后版本 + 现状"如实记录。
1.1 版本基准
| 项目 | 内容 |
|---|---|
| 本文介绍的软件版本 | Apache XML Commons Resolver 1.2(Resolver 组件的最后一个发布版本) |
| 查询日期 | 2026-10-18 |
| 版本判定依据 | Maven Central 构件 xml-resolver/xml-resolver 元数据 latest/release 为 1.2(metadata lastUpdated 2017-09-26),构件 xml-resolver-1.2.jar 时间戳 2006-12-22 |
| 项目状态 | Apache XML(xml.apache.org)旗下的 xml-commons 项目组件;官网页面标注版权区间 2001-2009,源码经 Apache SVN 管理;截至查询日无 GitHub 官方仓库(GitHub apache/xml-commons 路径不存在) |
| 许可 | Apache-2.0(ASF 标准声明) |
1.2 官方来源清单
| 来源 | 地址 | 用途 |
|---|---|---|
| xml-commons 项目主页 | https://xml.apache.org/commons/ | 项目定位与组件划分 |
| Resolver 概览页 | https://xml.apache.org/commons/components/resolver/ | 组件定位与文档入口 |
| 官方解析器文章 | https://xml.apache.org/commons/components/resolver/resolver-article.html | XML 实体与 URI 解析原理、catalog 用法 |
| Resolver 使用提示页 | https://xml.apache.org/commons/components/resolver/tips.html | CatalogManager.properties 配置示例 |
| Maven Central | https://repo1.maven.org/maven2/xml-resolver/xml-resolver/ | 版本交叉核验与构件时间戳 |
二、软件概述
本文介绍的是 Apache XML Commons Resolver 1.2。官方定义:xml-commons 项目聚焦于为各 XML 项目提供公共代码与公共规范,其一为 DOM、SAX、JAXP 等外部定义标准接口的统一打包(External 组件),其二即为 Resolver——一个面向 OASIS 实体解析技术委员会(OASIS Entity Resolution Technical Committee)所定义的 XML 目录(XML Catalogs)体系的实体解析器。
Resolver 解决的问题在官方文章《XML Entity and URI Resolvers》(Norman Walsh 撰写,文档版本 1.5)中有完整阐述:XML 文档通过 URI 引用 DTD、Schema、样式表等外部资源,直接依赖绝对 URL 会在离线或网络不可用时失败,相对 URL 又依赖文档所在环境;目录(catalog)机制把这些公共引用映射到本地受控副本,使解析过程可移植、可离线、可控。
现状提示:1.2 发布于 2006 年(Central 构件时间戳 2006-12-22),官网文档自 2009 年后未见实质更新,属于典型的低活跃基础组件;它长期作为 Xerces-J 等 XML 处理栈的目录解析底层被间接使用。
三、核心架构
3.1 目录解析模型
按官方文章与提示页,Resolver 的核心抽象包括:
- Catalog(目录):记录"公共标识符/系统标识符/URI → 本地资源"的映射规则,支持 OASIS XML Catalogs 格式(catalog 元素及 public、system、uri、rewrite* 等映射条目)。
- CatalogManager:目录解析的配置与生命周期入口,属性既可来自系统属性也可来自 CatalogManager.properties 文件,系统属性优先(官方注释说明)。
- CatalogResolver:实现 SAX EntityResolver 的解析器,注册到 XML 读取器后,按目录规则把外部实体引用重定向到本地资源。
3.2 与解析器的集成点
- 标准 JAXP/SAX 集成:把 org.apache.xml.resolver.tools.CatalogResolver 设为 XMLReader 的 EntityResolver,或直接使用自带的 ResolvingXMLReader(官方提示页与文章给出的集成类)。
- URI 级解析:除实体(SYSTEM/PUBLIC)外,还支持 URI 映射(uri 类目),覆盖 Schema 导入、样式表 include 等 URI 引用场景(官方文章对 uri 类条目的说明)。
3.3 命令行工具
- 发行包附带 org.apache.xml.resolver.apps.xparse 与 org.apache.xml.resolver.apps.resolver 等小型命令行工具,用于在启用目录的条件下解析/校验 XML 文档(官方文章与 API 文档目录)。
四、功能特性
4.1 OASIS XML Catalogs 支持
- 遵循 OASIS 实体解析技术委员会的目录规范:公共标识符映射、系统标识符映射、URI 映射、代理(delegate)规则与重写规则。
- 多目录支持:通过 catalogs 属性以分号分隔声明多个目录文件,按序查找(官方 CatalogManager.properties 注释示例)。
4.2 配置灵活性
- CatalogManager.properties 提供丰富的开关项:相对目录基准(relative-catalogs)、目录文件清单、缓存开关(catalogs 文件是否缓存解析结果)、是否使用静态目录实例等(官方注释版配置文件)。
- 属性来源双通道:JVM 系统属性或 properties 文件,系统属性优先,便于不改文件即可覆盖配置。
4.3 落库即用的解析器类
- CatalogResolver 可直接插入任意接受 EntityResolver 的解析流程;ResolvingXMLReader 开箱即用;对 JAXP Transformer 场景可经由 URIResolver 桥接(官方文章的集成章节)。
五、快速上手
以下示例引自官方文章与提示页,本文不做本地实测。
5.1 Maven 引入
Central 坐标(历史 groupId,无 org 前缀):
<dependency>
<groupId>xml-resolver</groupId>
<artifactId>xml-resolver</artifactId>
<version>1.2</version>
</dependency>
5.2 配置目录文件
按官方提示页的注释版 CatalogManager.properties(放置于应用 classpath 可达处):
# 分号分隔的目录文件清单
catalogs=../conf/xml-catalog.xml
目录文件为 OASIS XML Catalogs 格式,例如把公共 DTD 指向本地副本(官方文章示例风格):
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<public publicId="-//OASIS//DTD DocBook XML V4.1.2//EN"
uri="docbookx.dtd"/>
</catalog>
5.3 挂到解析器上
官方文章给出的标准集成方式:
org.apache.xml.resolver.tools.CatalogResolver cr =
new org.apache.xml.resolver.tools.CatalogResolver();
reader.setEntityResolver(cr);
或直接使用自带读取器 org.apache.xml.resolver.tools.ResolvingXMLReader,它已内置目录解析能力。
六、适用场景与限制
6.1 适用场景
- 存量 Java XML 处理链需要离线解析带外部 DTD/Schema 的文档,且不便升级技术栈时,1.2 仍是可用的目录解析器。
- 统一管理公共 DTD/Schema 的企业内网环境:用目录把公共引用收敛到内部受控副本,消除对公网可用性的依赖。
- 作为 Xerces-J 生态的既有组成部分被间接依赖(Xerces-J 的目录解析路径引用 xml-commons resolver)。
6.2 已知限制
- 最后发版为 2006 年的 1.2,官方文档停留在 2009 年前后;无 GitHub 官方仓库、无活跃社区支持,问题需自行查阅归档文档。
- JDK 9+ 模块化后,其依赖的旧接口(如 javax.xml.parsers 相关处理器设置方式)在新运行时上需要自行验证兼容性。
- 只解决"资源定位"问题,不做校验本身;校验能力仍由底层解析器(如 Xerces-J)提供。
- 新项目建议优先使用运行时/平台内置的目录能力(如 Xerces-J 自带的目录集成或 libxml2 的目录支持),仅在无法替换时才直接依赖 1.2。
七、同类选型对比
7.1 对比对象与数据基准
选取三个可比对象:libxml2(C 语言的 XML 全功能库,含 OASIS 目录支持)、Apache Xerces-J(Java 通用 XML 解析与校验器,内置目录解析集成)、Apache Xerces-C(C++ 解析器,自带 XMLCatalogResolver)。数据于 2026-10-18 取自各项目官方渠道(GNOME 官方下载服务器与 GitLab、Maven Central 元数据、GitHub 仓库页面与发行 feed)。
7.2 量化对比
| 维度 | XML Commons Resolver 1.2 | libxml2 2.15.4 | Apache Xerces-J 2.12.2 | Apache Xerces-C 3.3.0 |
|---|---|---|---|---|
| 开源许可 | Apache-2.0 | MIT(官方库声明) | Apache-2.0 | Apache-2.0 |
| GitHub stars + 最近发版 | 官方未公布(无 GitHub 官方仓库);1.2(2006-12-22,Central 构件时间戳) | 48 stars(GNOME GitLab star_count);2.15.4(2026-09-04,GNOME 下载服务器) | 8 stars(apache/xerces-j);2.12.2(Central 元数据更新 2022-01-27) | 159 stars(apache/xerces-c);3.3.0(2024-10-14,官方发行 feed) |
| 版本节奏 | 停滞(约 20 年无新版) | 非常活跃(2025-09 至 2026-09 连发 2.15.x 系列) | 低频维护 | 低频维护 |
| 兼容矩阵 | Java,SAX/JAXP EntityResolver 集成;JDK 9+ 需自行验证 | C 库,支持 OASIS XML Catalogs,跨平台构建 | Java,XML 1.0/1.1、XSD 1.0/1.1 校验,JDK 8 可运行 | C++,含 XMLCatalogResolver 类,跨平台构建 |
补充说明:libxml2、Xerces-J、Xerces-C 都是"解析器+目录能力"一体的方案,目录只是其内置功能之一;XML Commons Resolver 是纯目录解析组件,需绑定到某个解析器上使用。新构建 XML 处理链时,一体化的现代方案在维护性上占优。
7.3 选型建议
新项目直接选用运行环境内置或自带的目录能力(Java 选 Xerces-J 的目录集成,C/C++ 选 libxml2 或 Xerces-C),XML Commons Resolver 1.2 仅推荐给无法替换的历史工程沿用。
八、参考链接
- xml-commons 项目主页:https://xml.apache.org/commons/
- Resolver 概览页:https://xml.apache.org/commons/components/resolver/
- 官方解析器文章:https://xml.apache.org/commons/components/resolver/resolver-article.html
- Resolver 使用提示页(含 CatalogManager.properties 注释示例):https://xml.apache.org/commons/components/resolver/tips.html
- Maven Central 构件目录:https://repo1.maven.org/maven2/xml-resolver/xml-resolver/
- Apache Xerces-J:https://xerces.apache.org/xerces2-j/
- Apache Xerces-C:https://xerces.apache.org/xerces-c/
- libxml2 官方发布目录:https://download.gnome.org/sources/libxml2/