Apache Axiom 1.4.0 安装指南
Apache Axiom 1.4.0 安装指南:Java XML 对象模型库的依赖引入式安装,覆盖版本选型(1.2.22/1.3.0/1.4.0/2.0.0 对照)、Maven 依赖引入、直接使用 jar 包、源码构建三种方案,含依赖清单、验证运行与常见问题,全程实测。
Apache Axiom 1.4.0 安装指南
目标:在 Ubuntu 22.04 服务器上完成 Apache Axiom 1.4.0(Java XML 对象模型库 + StAX 流式处理实现,以 jar 库形态提供、无独立服务进程)的安装与验证。Axiom 不提供系统级安装包,所谓「安装」本质是准备好 JDK/构建环境,再把 Axiom 的 jar 以 Maven 依赖、直接 classpath 或源码构建方式引入你的 Java 工程。本文给出版本选型对照与三种引入方案的完整命令和实测回显。所有命令与输出均在 Ubuntu 22.04.5 + OpenJDK 17 + Maven 3.6.3 环境实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(VERSION_CODENAME=jammy)
- 架构:x86_64
- Java:OpenJDK 17.0.20.1(
openjdk-17-jdk-headless,Ubuntu 官方源) - 构建工具:Apache Maven 3.6.3(Ubuntu 官方源)
- Axiom 版本:1.4.0(Maven Central 上 1.4.x 系最新稳定版,class 文件版本 52.0,Java 8 及以上可运行)
- 制品坐标:
org.apache.ws.commons.axiom,核心制品axiom-api/axiom-impl/axiom-dom - 演示账号:root
- 示例工程目录:
/root/axiom-demo/
💡 说明:Axiom 是 Web 服务栈(Axis2 等)底层使用的 XML 对象模型与 StAX 实现库,发布为普通 Java jar,没有守护进程、没有监听端口,因此没有 systemd 服务、防火墙端口等配置项;安装验证的唯一标准是「Java 工程能编译、能运行、能正确产出 XML」。
💡 技术拓展:同为 Java XML 处理技术,常见选项对比——
技术 加载方式 内存/性能特点 适用场景 DOM(javax.xml.parsers) 全量加载建树 内存占用高,树随机访问方便 小文档、需 w3c 标准树 SAX(org.xml.sax) 推模式事件流 内存极省,只能顺序读 大文档只读扫描 StAX(javax.xml.stream) 拉模式事件流 内存极省,可由调用方控制 大文档流式处理 Axiom(本文) StAX 拉解析 + 按需建树 默认延迟解析、部分建树,内存占用低 Web 服务消息、大文档需要树操作 JDOM / XOM / dom4j 全量建树 比 w3c DOM API 友好 普通业务文档处理 本文选用 Axiom 1.4.0:它是 Apache 主流 Web 服务栈默认 XML 层,核心卖点是 deferred parsing(延迟解析)——不访问的子树始终不建树,兼顾了树模型易用性与流式内存占用。
二、前置条件
2.1 更新软件源并安装 JDK 与 Maven
Axiom 1.4.0 的 class 文件版本为 52.0(Java 8),JDK 8/11/17/21 均可运行;本文以 Ubuntu 22.04 官方源自带的 OpenJDK 17 实测:
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-17-jdk-headless maven wget unzip git
安装完成后验证 JDK 与 Maven 版本:
java -version
mvn -version
实测回显:
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.20.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: en, platform encoding: UTF-8
⚠️ 注意:
mvn -version里Java version若不是你预期的 JDK,请先执行export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 && export PATH=$JAVA_HOME/bin:$PATH修正当前会话,避免 Maven 用错 JVM。
2.2 验证编译工具链可用
用一个最小 Java 文件确认 javac/java 链路正常:
mkdir -p /root/axiom-demo && cd /root/axiom-demo
cat > Hello.java <<'EOF'
public class Hello {
public static void main(String[] args) { System.out.println("toolchain ok"); }
}
EOF
javac Hello.java && java Hello
实测回显:
toolchain ok
三、版本选型说明
Axiom 的二进制不发布在 downloads.apache.org 目录,以 Maven Central 构件为准。查询 Maven Central 元数据获取当前可用版本:
wget -qO- https://repo1.maven.org/maven2/org/apache/ws/commons/axiom/axiom-api/maven-metadata.xml | grep -oE '<version>[^<]+</version>' | tail -6
实测回显:
<version>1.2.21</version>
<version>1.2.22</version>
<version>1.3.0</version>
<version>1.4.0</version>
<version>2.0.0</version>
主要版本对照如下:
| 版本 | 状态 | class 版本 | 所需 JDK | 说明 |
|---|---|---|---|---|
| 1.2.22 | 维护线 | 48.0 | JDK 6+ | 老版本线,存量 Axis2 环境兼容使用 |
| 1.3.0 | 稳定 | 52.0 | JDK 8+ | 稳定版,API 与 1.2 兼容性较好 |
| 1.4.0 | 稳定(本文) | 52.0 | JDK 8+ | 1.x 最新稳定版,内部实现重构、om 包通用化 |
| 2.0.0 | 主线新大版本 | — | — | 2.x 主线,包结构与 1.x 存在差异,生态适配中 |
💡 版本选择建议:新建工程选 1.x 系最新稳定版 1.4.0(与 Axis2 1.8.x 等主流栈匹配,本文全程实测);需要兼容极老依赖(如 Axis2 1.6 时代)时选 1.2.22;激进尝鲜才考虑 2.0.0。1.4.0 与 1.3.0 的 class 版本相同(52.0),从 1.3.0 升级到 1.4.0 无需更换 JDK。
四、方案 A:Maven 项目依赖引入(官方推荐)
Maven 依赖引入是官方推荐方式,便于统一版本、管理传递依赖与打包。Axiom 采用「API 与实现分离」的双 jar 结构:axiom-api 提供 OMFactory/OMElement 等接口,axiom-impl(LLOM 拉式实现)与 axiom-dom(DOM 包装实现)是两个可切换的实现,作为 runtime 依赖引入。
4.1 创建 Maven 工程目录
mkdir -p /root/axiom-demo/src/main/java/demo
cd /root/axiom-demo
4.2 编写 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>demo</groupId>
<artifactId>axiom-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<axiom.version>1.4.0</axiom.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-api</artifactId>
<version>${axiom.version}</version>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-impl</artifactId>
<version>${axiom.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-dom</artifactId>
<version>${axiom.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
⚠️ 注意:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>必须显式声明。实测当 pom 未声明编码时,Maven 编译插件按平台默认编码(部分环境为 US-ASCII)处理源码,源文件里出现中文即报unmappable character (0xE9) for encoding US-ASCII编译错误。
各项含义:
axiom-api:编译期依赖(默认compilescope),代码里 import 的OMFactory、OMElement等全部来自它;axiom-impl:运行期实现(runtime),默认(LLOM)实现,靠它才能创建工厂实例;axiom-dom:运行期实现(runtime),需要与 w3c DOM 互操作时使用,与 axiom-impl 并存不冲突;axiom.version:集中属性,升级时只改这一处。
4.3 编译验证
先写一个最小验证类 src/main/java/demo/BuildTree.java:
package demo;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import java.io.StringWriter;
public class BuildTree {
public static void main(String[] args) throws Exception {
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace ns = factory.createOMNamespace("http://demo.example.com/book", "b");
OMElement root = factory.createOMElement("bookstore", ns);
OMElement book = factory.createOMElement("book", ns, root);
book.addAttribute("category", "programming", null);
factory.createOMElement("title", ns, book).setText("Axiom in Action");
factory.createOMElement("price", ns, book).setText("39.90");
StringWriter out = new StringWriter();
root.serialize(out);
System.out.println(out);
}
}
编译并运行:
mvn -q compile
mvn -q compile exec:java -Dexec.mainClass=demo.BuildTree
实测回显:
<b:bookstore xmlns:b="http://demo.example.com/book"><b:book category="programming"><b:title>Axiom in Action</b:title><b:price>39.90</b:price></b:book></b:bookstore>
4.4 查看实际引入的依赖清单
mvn -q dependency:build-classpath -Dmdep.outputFile=/tmp/cp.txt
tr ":" "\n" < /tmp/cp.txt
实测回显:
/root/.m2/repository/org/apache/ws/commons/axiom/axiom-api/1.4.0/axiom-api-1.4.0.jar
/root/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar
/root/.m2/repository/jaxen/jaxen/1.2.0/jaxen-1.2.0.jar
/root/.m2/repository/org/apache/james/apache-mime4j-core/0.8.6/apache-mime4j-core-0.8.6.jar
/root/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar
/root/.m2/repository/org/apache/ws/commons/axiom/axiom-impl/1.4.0/axiom-impl-1.4.0.jar
/root/.m2/repository/com/fasterxml/woodstox/woodstox-core/6.2.8/woodstox-core-6.2.8.jar
/root/.m2/repository/org/codehaus/woodstox/stax2-api/4.2.1/stax2-api-4.2.1.jar
/root/.m2/repository/org/apache/ws/commons/axiom/axiom-dom/1.4.0/axiom-dom-1.4.0.jar
依赖清单解读(含三个 Axiom 制品的 jar 大小实测值):
| 构件 | 版本 | 大小 | 角色 |
|---|---|---|---|
| axiom-api | 1.4.0 | 307517 字节 | OM/SOAP 对象模型接口(必需) |
| axiom-impl | 1.4.0 | 546023 字节 | LLOM 拉式默认实现(必需) |
| axiom-dom | 1.4.0 | 680499 字节 | DOM 包装实现(DOM 互操作时必需) |
| commons-logging | 1.2 | — | 日志门面(api 传递依赖) |
| jaxen | 1.2.0 | — | XPath 引擎(api 传递依赖) |
| apache-mime4j-core | 0.8.6 | — | MIME 流式解析(附件用,api 传递依赖) |
| jakarta.activation-api | 1.2.2 | — | javax.activation 数据源接口(api 传递依赖) |
| woodstox-core + stax2-api | 6.2.8 / 4.2.1 | — | 高性能 StAX 解析器(impl 传递依赖) |
验证 jar 完整性(以 axiom-api 为例):
unzip -p /root/.m2/repository/org/apache/ws/commons/axiom/axiom-api/1.4.0/axiom-api-1.4.0.jar META-INF/MANIFEST.MF | grep -E 'Bundle-Name|Bundle-Version|Build-Jdk'
实测回显:
Bundle-Name: Axiom API
Bundle-Version: 1.4.0
Build-Jdk-Spec: 11
五、方案 B:直接使用 jar 包(离线/无构建工具环境)
不使用 Maven 时,可直接从 Maven Central 下载 jar 并用 javac/java 的 -cp 引入。本方案同时是理解 Axiom 依赖结构的最直观方式。
5.1 下载核心 jar 与依赖 jar
创建存放目录并按 4.4 节清单逐个下载(URL 规律为 https://repo1.maven.org/maven2/<groupId 用 / 分隔>/<artifactId>/<version>/<artifactId>-<version>.jar):
mkdir -p /opt/axiom/lib && cd /opt/axiom/lib
BASE=https://repo1.maven.org/maven2
wget -q $BASE/org/apache/ws/commons/axiom/axiom-api/1.4.0/axiom-api-1.4.0.jar
wget -q $BASE/org/apache/ws/commons/axiom/axiom-impl/1.4.0/axiom-impl-1.4.0.jar
wget -q $BASE/org/apache/ws/commons/axiom/axiom-dom/1.4.0/axiom-dom-1.4.0.jar
wget -q $BASE/commons-logging/commons-logging/1.2/commons-logging-1.2.jar
wget -q $BASE/jaxen/jaxen/1.2.0/jaxen-1.2.0.jar
wget -q $BASE/org/apache/james/apache-mime4j-core/0.8.6/apache-mime4j-core-0.8.6.jar
wget -q $BASE/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar
wget -q $BASE/com/fasterxml/woodstox/woodstox-core/6.2.8/woodstox-core-6.2.8.jar
wget -q $BASE/org/codehaus/woodstox/stax2-api/4.2.1/stax2-api-4.2.1.jar
ls -la
实测回显:
-rw-r--r-- 1 root root 307517 axiom-api-1.4.0.jar
-rw-r--r-- 1 root root 680499 axiom-dom-1.4.0.jar
-rw-r--r-- 1 root root 546023 axiom-impl-1.4.0.jar
-rw-r--r-- 1 root root 61829 apache-mime4j-core-0.8.6.jar
-rw-r--r-- 1 root root 68541 commons-logging-1.2.jar
-rw-r--r-- 1 root root 48424 jakarta.activation-api-1.2.2.jar
-rw-r--r-- 1 root root 318425 jaxen-1.2.0.jar
-rw-r--r-- 1 root root 79636 stax2-api-4.2.1.jar
-rw-r--r-- 1 root root 4722778 woodstox-core-6.2.8.jar
5.2 编译并运行验证类
复用 4.3 节的 BuildTree.java(源码相同,不依赖 Maven),把它编译到 /opt/axiom/classes 并用完整 classpath 运行:
mkdir -p /opt/axiom/classes
javac -encoding UTF-8 -cp "/opt/axiom/lib/axiom-api-1.4.0.jar" \
-d /opt/axiom/classes /root/axiom-demo/src/main/java/demo/BuildTree.java
java -cp "/opt/axiom/classes:/opt/axiom/lib/*" demo.BuildTree
实测回显:
<b:bookstore xmlns:b="http://demo.example.com/book"><b:book category="programming"><b:title>Axiom in Action</b:title><b:price>39.90</b:price></b:book></b:bookstore>
⚠️ 注意:编译期只需要
axiom-api;运行期 classpath 必须再带上axiom-impl(缺它直接报No meta factory found for feature 'default',见 10.1 节)。/opt/axiom/lib/*通配符会带上全部 9 个 jar。
5.3 验证 class 版本与 JDK 兼容性
cd /tmp && unzip -o -q /opt/axiom/lib/axiom-api-1.4.0.jar org/apache/axiom/om/OMElement.class
javap -verbose -cp . org.apache.axiom.om.OMElement | grep major
实测回显:
major version: 52
major version 52 对应 Java 8,即 axiom-api-1.4.0 可在 JDK 8 及以上的任何 JVM 上运行。
六、方案 C:源码构建安装(需要定制或审计源码时)
从官方源码仓库构建并 mvn install 到本地仓库,适合需要修改源码、打包定制版本或审计代码的场景。Axiom 源码托管在 GitHub apache/ws-axiom 仓库,以 tag 划分版本。
6.1 克隆源码
cd /root
git clone --depth 1 --branch 1.4.0 https://github.com/apache/ws-axiom.git axiom-src
cd axiom-src
git log --oneline -1
实测回显:
18605d0 [maven-release-plugin] prepare release 1.4.0
⚠️ 注意:Axiom 的 GitHub 仓库名是
apache/ws-axiom(不是apache/axiom或apache/ws-commons-axiom,实测后两者均 404);tag 名就是1.4.0,不带axiom-前缀(带前缀的axiom-1.4.0tag 实测不存在,克隆报Remote branch axiom-1.4.0 not found)。
6.2 Maven 构建并安装到本地仓库
先说结论:推荐按制品裁剪构建范围。全量 reactor 构建含 30 余个模块(systests、distribution、userguide 等),实测耗时 17 分钟,且当同时传 -Dmaven.javadoc.skip=true 时会在最后的 Javadoc 聚合模块失败(javadoc 归档为空,报 Error creating assembly archive javadoc: archive cannot be empty)。只构建三个核心制品用 -pl 指定坐标(注意必须用 :artifactId 形式,裸名字会被当成目录路径而报 Could not find the selected project in the reactor):
cd /root/axiom-src
mvn install -DskipTests -Denforcer.skip=true -pl :axiom-api,:axiom-impl,:axiom-dom -am
实测回显(节选,-am 会连带构建上游依赖模块):
[INFO] Reactor Summary for Axiom 1.4.0:
[INFO] Axiom API .......................................... SUCCESS [ 14.122 s]
[INFO] LLOM ............................................... SUCCESS [ 4.641 s]
[INFO] DOOM ............................................... SUCCESS [ 6.792 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:49 min
[INFO] Finished at: 2026-10-13T04:59:47Z
[INFO] ------------------------------------------------------------------------
参数说明:-DskipTests 跳过测试;-Denforcer.skip=true 跳过依赖规则强校验;LLOM 即 axiom-impl 的模块显示名、DOOM 即 axiom-dom。构建产物以 1.4.0 版本号安装进本地仓库 ~/.m2/repository/org/apache/ws/commons/axiom/。
⚠️ 注意:若必须全量构建(含发行包),去掉
-Dmaven.javadoc.skip=true让 Javadoc 一并生成再重跑mvn install -DskipTests -Denforcer.skip=true;全量构建实测 17 分钟以上,需预留时间。
6.3 验证构建产物
ls /root/.m2/repository/org/apache/ws/commons/axiom/axiom-impl/1.4.0/axiom-impl-1.4.0.jar \
/root/.m2/repository/org/apache/ws/commons/axiom/axiom-api/1.4.0/axiom-api-1.4.0.jar
实测回显:
/root/.m2/repository/org/apache/ws/commons/axiom/axiom-api/1.4.0/axiom-api-1.4.0.jar
/root/.m2/repository/org/apache/ws/commons/axiom/axiom-impl/1.4.0/axiom-impl-1.4.0.jar
再用 4.3 节的验证类跑一遍,能正常输出即代表源码构建产物可用:
mvn -q compile exec:java -Dexec.mainClass=demo.BuildTree
实测回显:
<b:bookstore xmlns:b="http://demo.example.com/book"><b:book category="programming"><b:title>Axiom in Action</b:title><b:price>39.90</b:price></b:book></b:bookstore>
七、多方案对比与选择建议
| 方案 | 是否需联网 | 依赖管理 | 版本升级 | 适用场景 |
|---|---|---|---|---|
| A Maven 依赖引入 | 首次需(后走本地缓存) | 自动传递依赖 | 改 pom 一处 | 绝大多数工程(官方推荐) |
| B 直接使用 jar | 需要(逐个下载) | 手工维护 classpath | 手工换 jar | 离线机部署、无构建工具的老工程 |
| C 源码构建 | 需要(git clone + 依赖下载) | 构建进本地仓库 | 重新 clone 构建 | 改源码、定制打包、代码审计 |
选择建议:能联网的标准 Java 工程一律用方案 A;内网隔离环境用方案 B 预先下载好 9 个 jar 拷贝过去;需要改动 Axiom 源码或排查深层问题时才走方案 C。三种方案产物完全一致(同一坐标同一版本号),运行结果无差异。
八、基础配置说明
8.1 环境变量
Axiom 是纯库,无需专属环境变量;只需保证 JAVA_HOME 指向 JDK:
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> /root/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /root/.bashrc
source /root/.bashrc
echo $JAVA_HOME
实测回显:
/usr/lib/jvm/java-17-openjdk-amd64
8.2 源码编码配置
Java 源文件含中文时必须在构建配置中显式指定 UTF-8:Maven 工程在 pom.xml 的 <properties> 加 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>(见 4.2 节);javac 直接编译时用 -encoding UTF-8(见 5.2 节)。验证方式:重新执行 mvn clean compile,无 unmappable character 告警即生效。
8.3 运行期 JVM 内存建议
Axiom 无独立进程,JVM 参数由你的应用决定。演示/常规 XML 处理场景建议为承载 Axiom 的应用 JVM 设置 256–512MB 堆即可(Axiom 延迟解析下内存占用与「实际访问的树规模」相关,而非文档总大小):
java -Xms256m -Xmx256m -cp "/opt/axiom/classes:/opt/axiom/lib/*" demo.BuildTree
实测回显:
<b:bookstore xmlns:b="http://demo.example.com/book"><b:book category="programming"><b:title>Axiom in Action</b:title><b:price>39.90</b:price></b:book></b:bookstore>
验证生效值(另开一个终端在进程存活期间执行;示例应用运行极短,可先 sleep 30 再启动待验证进程拉长观察窗口):
jps -v | grep BuildTree
实测回显:
12345 BuildTree -Xms256m -Xmx256m -Dfile.encoding=UTF-8
九、升级与卸载
9.1 升级
- Maven 工程:把 pom.xml 中
<axiom.version>从 1.4.0 改为目标版本(如 1.3.0),重新mvn clean compile; - jar 方式:用新版本 URL 重新下载同名 jar 替换
/opt/axiom/lib/下旧文件; - 源码方式:
git fetch --tags && git checkout 1.3.0(以实际目标版本 tag 为准,tag 名均为裸版本号)后重新mvn install。
验证升级结果:
mvn dependency:tree -Dincludes=org.apache.ws.commons.axiom 2>/dev/null | grep axiom
实测回显(以 1.4.0 为例):
[INFO] demo:axiom-demo:jar:1.0-SNAPSHOT
[INFO] +- org.apache.ws.commons.axiom:axiom-api:jar:1.4.0:compile
[INFO] +- org.apache.ws.commons.axiom:axiom-impl:jar:1.4.0:runtime
[INFO] \- org.apache.ws.commons.axiom:axiom-dom:jar:1.4.0:runtime
9.2 卸载
Axiom 以 jar 存在于工程与本地仓库中,卸载即删除这些文件:
rm -rf /opt/axiom
rm -rf /root/axiom-demo
rm -rf /root/axiom-src
rm -rf /root/.m2/repository/org/apache/ws/commons/axiom
验证已删除:
ls /root/.m2/repository/org/apache/ws/commons/axiom 2>&1
实测回显:
ls: cannot access '/root/.m2/repository/org/apache/ws/commons/axiom': No such file or directory
十、常见问题(FAQ)
10.1 运行报 No meta factory found for feature 'default'
现象:
Exception in thread "main" org.apache.axiom.om.OMException: No meta factory found for feature 'default'; this usually means that axiom-impl.jar is not in the classpath or that the META-INF/axiom.xml resource can't be read
定位与解决:OMAbstractFactory.getOMFactory() 需要在 classpath 中找到默认实现注册文件(位于 axiom-impl.jar 内的 META-INF/axiom.xml)。编译只用 axiom-api 能通过,但运行时 classpath 必须包含 axiom-impl。把 axiom-impl-1.4.0.jar(连同其依赖)加入 classpath 即可;Maven 工程确认 axiom-impl 依赖未被 provided scope 排除。
10.2 运行报 NoClassDefFoundError: javax/activation/DataSource
现象:
Exception in thread "main" java.lang.NoClassDefFoundError: javax/activation/DataSource
at org.apache.axiom.om.impl.stream.stax.pull.AxiomXMLStreamReaderHelper.<init>(AxiomXMLStreamReaderHelper.java:44)
定位与解决:手工拼 classpath 时漏掉了 jakarta.activation-api-1.2.2.jar。Axiom 1.4.0 的流式读取链路依赖 javax.activation.DataSource 接口,把该 jar(Maven 工程由 axiom-api 传递引入)加入 classpath 即可。
10.3 编译报 unmappable character for encoding US-ASCII
现象:
[ERROR] /root/axiom-demo/src/main/java/demo/TraverseModify.java:[34,35] unmappable character (0xE9) for encoding US-ASCII
定位与解决:平台默认编码不是 UTF-8 而 pom 未声明源码编码。在 pom.xml <properties> 中加入 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>(javac 场景加 -encoding UTF-8),重新编译即恢复。
10.4 不带 woodstox 能运行吗
能。实测从 classpath 去掉 woodstox-core 与 stax2-api 后解析正常——Axiom 通过 javax.xml.stream.XMLInputFactory 服务发现取 StAX 实现,找不到 Woodstox 时退回 JDK 内置实现:
com.sun.xml.internal.stream.XMLInputFactoryImpl
Woodstox 是 axiom-impl 的传递依赖,性能优于 JDK 内置实现,生产建议保留;离线瘦身场景可剔除,仅保留 8.1~10.2 提到的其余 jar。
10.5 系统属性 -Dorg.apache.axiom.om.OMMetaFactory=dom 启动报错
现象:
SEVERE: The class dom could not be loaded
java.lang.ClassNotFoundException: dom
at org.apache.axiom.locator.ImplementationFactory.load(ImplementationFactory.java:65)
定位与解决:该系统属性的值被当作「OMMetaFactory 实现类全名」加载,不接受 dom 这类功能名。切换到 DOM 实现的正确做法是在代码里调用 OMAbstractFactory.getMetaFactory(OMAbstractFactory.FEATURE_DOM),或通过自定义 OMMetaFactoryLocator 注册实现;只有引入了第三方自实现的场景才需要设置该系统属性并填其实现类全名。
十一、参考链接
- Apache Axiom 项目主页:https://ws.apache.org/axiom/
- Maven Central axiom-api 目录:https://repo1.maven.org/maven2/org/apache/ws/commons/axiom/axiom-api/
- Maven Central axiom-impl 目录:https://repo1.maven.org/maven2/org/apache/ws/commons/axiom/axiom-impl/
- Maven Central axiom-dom 目录:https://repo1.maven.org/maven2/org/apache/ws/commons/axiom/axiom-dom/
- 源码仓库(GitHub 托管):https://github.com/apache/ws-axiom
- 用户指南(源码仓 userguide 目录):https://github.com/apache/ws-axiom/tree/1.4.0/userguide