Ubuntu 22.04 安装 Apache XMLBeans 指南

本指南在 Ubuntu 22.04.5 LTS 服务器上实测了 Apache XMLBeans 5.4.1 的两种引入方式(Maven 依赖与官方 jar 直用)及 scomp 编译器直调,全部命令与回显真实可复现。

Apache XMLBeansApache XMLBeans2026/10/15

Ubuntu 22.04 安装 Apache XMLBeans 指南

目标:在 Ubuntu 22.04.5 LTS 服务器上完成 Apache XMLBeans 5.4.1 的安装与验证,覆盖 Maven 依赖引入与官方 jar 直用两条路径,并以 scomp 编译器将示例 XSD 编译为 Java 类型 jar,实测通过。

一、环境信息

本文所有命令与回显均来自以下真实服务器环境,实测时间 2026-10-15:

# head -3 /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
# uname -m
x86_64

XMLBeans 是一个纯 Java 的 XML 绑定框架(把 XML 与 XSD 编译成强类型 Java 类),它不是常驻服务,安装即"让 Java 程序能使用其 jar"。因此验证标准为:java/javac/mvn 可用、依赖可解析、示例代码可编译运行。当前环境基线:

# java -version
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1~22.04)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1~22.04, mixed mode, sharing)
  • 工作根目录:/work(示例 XSD 与产物统一放在 /work/schema、/work/mvn-demo)
  • 实测版本:Apache XMLBeans 5.4.1(Maven Central 最新 release)
  • Maven 坐标:org.apache.xmlbeans:xmlbeans:5.4.1

二、前置条件

  1. 具备 root 权限,能访问 Ubuntu 软件源;
  2. 服务器可访问 Maven Central(repo1.maven.org),用于下载依赖与 jar:
# curl -sI https://repo1.maven.org/maven2/org/apache/xmlbeans/xmlbeans/ | head -1
HTTP/2 200

若未安装 curl,先补装:

# apt-get install -y curl
  1. 磁盘空间不低于 2 GB(JDK 17 + Maven + 本地仓库依赖约占 1 GB)。

三、版本选型说明

以 Maven Central 实际元数据为准(https://repo1.maven.org/maven2/org/apache/xmlbeans/xmlbeans/maven-metadata.xml):

<latest>5.4.1</latest>
<release>5.4.1</release>
<lastUpdated>20260923082850</lastUpdated>

版本列表从 2.2.0 一路演进到 5.4.1,主要发布线如下(可从同一元数据文件的 <versions> 段核实):

版本线最后版本特征是否建议
2.x2.6.0上世纪 XMLBeans 架构(2004~2012),JDK 5 时代仅维护遗留系统
3.x3.1.0独立为 Apache 项目后的过渡版本不建议新项目
4.x4.0.0API 重构起点,基线 Java 8存量升级过渡
5.x5.4.1基线 Java 8(实测字节码 major=52)、日志改用 log4j-api推荐

💡 技术拓展:同为"XSD → Java 绑定"方案,与 JAXB(JDK 8 内置、JDK 11 后需外挂依赖)相比,XMLBeans 保留原始 XML 的完整游标访问能力(XmlCursor),且类型系统可运行期自省;与 DOM4j/JDOM 相比,XMLBeans 多了 Schema 编译期强类型。本文选 XMLBeans 5.4.1:JDK 8 与 17 双兼容(第七节实测),且仍在活跃维护。

本文实际采用 5.4.1,它对 JDK 的要求低至 Java 8(jar 内 org/apache/xmlbeans/XmlObject.class 字节码 major=52,实测确认),在 Ubuntu 默认的 OpenJDK 17 上直接可用。

四、方案 A:Maven 依赖安装(推荐)

4.1 方案说明

通过 Maven 坐标 org.apache.xmlbeans:xmlbeans:5.4.1 引入,Maven 会自动带上其编译期依赖 org.apache.logging.log4j:log4j-api(XMLBeans 5.x 的日志门面,实测传递依赖版本 2.26.1)。XPath/XQuery 完整能力所需的 Saxon-HE 在 5.4.1 的 POM 中是 provided 作用域,需要显式声明。

4.2 安装 JDK 17 与 Maven

# apt-get install -y openjdk-17-jdk maven
maven is already the newest version (3.6.3-5).
openjdk-17-jdk is already the newest version (17.0.20.1+1-1~22.04).
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

确认工具链版本:

# mvn -v
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_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "6.8.0-138-generic", arch: "amd64", family: "unix"

注意 platform encoding: ANSI_X3.4-1968:这是 POSIX locale 导致的,处理中文 XML 时务必在运行参数里显式 -Dfile.encoding=UTF-8(第七节)。

4.3 创建工程并引入依赖

# mkdir -p /work/mvn-demo/src/main/java/demo
# cd /work/mvn-demo

/work/mvn-demo/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>xmlbeans-demo</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.release>17</maven.compiler.release>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.xmlbeans</groupId>
      <artifactId>xmlbeans</artifactId>
      <version>5.4.1</version>
    </dependency>
    <dependency>
      <groupId>net.sf.saxon</groupId>
      <artifactId>Saxon-HE</artifactId>
      <version>12.10</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version>
      </plugin>
    </plugins>
  </build>
</project>

要点:显式固定 maven-compiler-plugin 3.11.0 并用 maven.compiler.release 指定目标版本,避免 Maven 3.6.3 默认的过老 compiler 插件(它不认识 --release 参数,会直接报 Fatal error compiling: invalid flag: --release)。

4.4 最小验证代码

/work/mvn-demo/src/main/java/demo/GenericDemo.java:

package demo;

import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;

import javax.xml.namespace.QName;
import java.io.File;

public class GenericDemo {

    static final String NS = "http://example.com/order";
    static final QName Q_ORDER = new QName(NS, "order");
    static final QName Q_CUSTOMER = new QName(NS, "customer");
    static final QName Q_EMAIL = new QName(NS, "email");
    static final QName Q_ID = new QName("", "id");

    public static void main(String[] args) throws Exception {
        XmlObject doc = XmlObject.Factory.parse(new File("/work/schema/order.xml"));
        System.out.println("解析完成,schemaType = " + doc.schemaType());

        XmlObject[] orders = doc.selectChildren(Q_ORDER);
        System.out.println("selectChildren(order) 命中 = " + orders.length);
        XmlObject order = orders[0];

        XmlObject id = order.selectAttribute(Q_ID);
        System.out.println("selectAttribute(id).getStringValue() = "
                + ((org.apache.xmlbeans.SimpleValue) id).getStringValue());

        XmlObject email = order
                .selectChildren(Q_CUSTOMER)[0]
                .selectChildren(Q_EMAIL)[0];
        System.out.println("customer/email 文本值 = "
                + ((org.apache.xmlbeans.SimpleValue) email).getStringValue());

        String pretty = doc.xmlText(new XmlOptions().setSavePrettyPrint());
        System.out.println("缩进序列化首行 = " + pretty.split("\n")[0]);
    }
}

配套的示例 XML /work/schema/order.xml(与第五节 XSD 同源,此处直接给出):

<?xml version="1.0" encoding="UTF-8"?>
<ord:order xmlns:ord="http://example.com/order" id="A-2026-1015" date="2026-10-15">
  <ord:customer vip="true">
    <ord:name>张伟</ord:name>
    <ord:email>zhangwei@example.com</ord:email>
  </ord:customer>
  <ord:item sku="SKU-1001" qty="2">
    <ord:name>机械键盘</ord:name>
    <ord:price>399.0</ord:price>
  </ord:item>
</ord:order>

4.5 编译与运行验证

# cd /work/mvn-demo && mvn -q -B compile
# echo $?
0

查看依赖解析结果(确认 log4j-api 为 XMLBeans 的传递依赖):

# mvn -B clean dependency:tree
...
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ xmlbeans-demo ---
[INFO] demo:xmlbeans-demo:jar:1.0.0
[INFO] +- org.apache.xmlbeans:xmlbeans:jar:5.4.1:compile
[INFO] |  \- org.apache.logging.log4j:log4j-api:jar:2.26.1:compile
[INFO] +- net.sf.saxon:Saxon-HE:jar:12.10:compile
[INFO] |  \- org.xmlresolver:xmlresolver:jar:5.3.3:compile
[INFO] |     \- org.xmlresolver:xmlresolver:data:jar:5.3.3:compile
[INFO] \- com.example:order-xmlbeans:jar:1.0.0:compile
...
[INFO] BUILD SUCCESS

运行:

# M2=~/.m2/repository
# java -Dfile.encoding=UTF-8 -cp target/classes:$M2/org/apache/xmlbeans/xmlbeans/5.4.1/xmlbeans-5.4.1.jar:$M2/org/apache/logging/log4j/log4j-api/2.26.1/log4j-api-2.26.1.jar demo.GenericDemo
解析完成,schemaType = N=
selectChildren(order) 命中 = 1
selectAttribute(id).getStringValue() = A-2026-1015
customer/email 文本值 = zhangwei@example.com
缩进序列化首行 = <?xml version="1.0" encoding="UTF-8"?>

验证通过:schemaType = N= 表示当前类路径上没有该文档的 Schema 类型系统(N = NoType),解析退化为通用 XmlObject,仍可按 QName 正确选取节点;执行 scomp 生成类型 jar 并加入类路径后,同一行会变成 D=order@http://example.com/order(详见《Apache XMLBeans 5.4.1 快速入门与集成示例》第四节实测)。

五、方案 B:官方 jar 直用与 scomp 直调(离线友好)

5.1 方案说明

5.x 已不再发布传统的 bin 分发包:官方下载目录 downloads.apache.org/xmlbeans/ 已下线(404),archive.apache.org/dist/xmlbeans/binaries/ 最新的二进制分发包停留在 2.6.0。因此 5.x 的"安装版"以 Maven Central 的 jar 为权威来源,scomp 编译器也内置在该 jar 中(主类 org.apache.xmlbeans.impl.tool.SchemaCompiler)。

💡 技术拓展:5.4.1 jar 内的 org.apache.xmlbeans.impl.tool.XMLBean 是 Ant 任务类(继承 org.apache.tools.ant.taskdefs.MatchingTask,实测无 main 方法),它不是命令行入口;命令行入口是同包的 SchemaCompiler(实测带 public static void main(String[]))。旧教程让读者去找 bin/scomp 脚本的做法对 5.x 已失效。

5.2 下载与校验

# mkdir -p /work && cd /work
# curl -sO https://repo1.maven.org/maven2/org/apache/xmlbeans/xmlbeans/5.4.1/xmlbeans-5.4.1.jar
# curl -sO https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.26.1/log4j-api-2.26.1.jar
# curl -sO https://repo1.maven.org/maven2/net/sf/saxon/Saxon-HE/12.10/Saxon-HE-12.10.jar
# ls -l xmlbeans-5.4.1.jar log4j-api-2.26.1.jar Saxon-HE-12.10.jar
-rw-r--r-- 1 root root 2227616 Oct 15 11:02 xmlbeans-5.4.1.jar
-rw-r--r-- 1 root root  351428 Oct 15 11:18 log4j-api-2.26.1.jar
-rw-r--r-- 1 root root 5793277 Oct 15 11:41 Saxon-HE-12.10.jar
# sha1sum xmlbeans-5.4.1.jar
7a7f86b1c0b4cf30081d0c99ec8f7303208d555e  xmlbeans-5.4.1.jar
# curl -s https://repo1.maven.org/maven2/org/apache/xmlbeans/xmlbeans/5.4.1/xmlbeans-5.4.1.jar.sha1
7a7f86b1c0b4cf30081d0c99ec8f7303208d555e

三个文件的 SHA1 实测均与 Maven Central 官方 .sha1 一致:

文件SHA1
xmlbeans-5.4.1.jar7a7f86b1c0b4cf30081d0c99ec8f7303208d555e
log4j-api-2.26.1.jarb9864ed8d0c01f65f3b0bf70f1447e5cc1b49c24
Saxon-HE-12.10.jar1d6492dbfa32ddb2cd432fa3fbb940bf8137a5d2

xmlbeans-5.4.1.jar 内含 scomp 与全部类型系统,无需再下载其它构件。

5.3 jar 直跑验证

# mkdir -p /root/jar-run && cd /root/jar-run
# cp /work/mvn-demo/src/main/java/demo/GenericDemo.java .
# javac -encoding UTF-8 -cp /work/xmlbeans-5.4.1.jar:/work/log4j-api-2.26.1.jar -d out GenericDemo.java
# echo $?
0
# java -Dfile.encoding=UTF-8 -cp out:/work/xmlbeans-5.4.1.jar:/work/log4j-api-2.26.1.jar demo.GenericDemo
解析完成,schemaType = N=
selectChildren(order) 命中 = 1
selectAttribute(id).getStringValue() = A-2026-1015
customer/email 文本值 = zhangwei@example.com
缩进序列化首行 = <?xml version="1.0" encoding="UTF-8"?>

注意类路径里必须带 log4j-api-2.26.1.jar,缺它时运行期直接 NoClassDefFoundError: org/apache/logging/log4j/Logger(第九节 FAQ 复现)。

5.4 scomp 直调:XSD → jar

以 /work/schema/order.xsd 为例:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:ord="http://example.com/order"
           targetNamespace="http://example.com/order"
           elementFormDefault="qualified">
  <xs:element name="order" type="ord:OrderType"/>
  <xs:complexType name="OrderType">
    <xs:sequence>
      <xs:element name="customer" type="ord:CustomerType"/>
      <xs:element name="item" type="ord:ItemType" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" use="required"/>
    <xs:attribute name="date" type="xs:date" use="required"/>
  </xs:complexType>
  <xs:complexType name="CustomerType">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="email" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="vip" type="xs:boolean" default="false"/>
  </xs:complexType>
  <xs:complexType name="ItemType">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="price" type="xs:double"/>
    </xs:sequence>
    <xs:attribute name="sku" type="xs:string" use="required"/>
    <xs:attribute name="qty" type="xs:int" use="required"/>
  </xs:complexType>
</xs:schema>

先看工具自述(确认这是 scomp 本体):

# cd /work
# java -cp xmlbeans-5.4.1.jar org.apache.xmlbeans.impl.tool.SchemaCompiler -help
Compiles a schema into XML Bean classes and metadata.
Usage: scomp [opts] [dirs]* [schema.xsd]* [service.wsdl]* [config.xsdconfig]*
Options include:
    -cp [a;b;c] - classpath
    -d [dir] - target binary directory for .class and .xsb files
    -src [dir] - target directory for generated .java files
    -srconly - do not compile .java files or jar the output.
    -out [xmltypes.jar] - the name of the output jar
    -name - the name of the schema type - defaults to autogenerated name
    -dl - permit network downloads for imports and includes (default is off)
    -noupa - do not enforce the unique particle attribution rule
    -nopvr - do not enforce the particle valid (restriction) rule
    -noann - ignore annotations
    -novdoc - do not validate contents of <documentation>
    -noext - ignore all extension (Pre/Post and Interface) found in .xsdconfig files
    -compiler - path to external java compiler
    -ms - initial memory for external java compiler (default '8m')
    -mx - maximum memory for external java compiler (default '256m')
    -debug - compile with debug symbols
    -quiet - print fewer informational messages
    -verbose - print more informational messages
    -version - prints version information
    -license - prints license information
    -allowmdef "[ns] [ns] [ns]" - ignores multiple defs in given namespaces (use ##local for no-namespace)
    -catalog [file] -  catalog file for org.apache.xml.resolver.tools.CatalogResolver. (Note: needs resolver.jar from http://xml.apache.org/commons/components/resolver/index.html)
    -partialMethods [list] -  comma separated list of bean methods to be generated. Use "-" to negate and "ALL" for all.
                              processed left-to-right, e.g. "ALL,-GET_LIST" exclude java.util.List getters - see XmlOptions.BeanMethod
    -repackage - repackage specification, e.g. "org.apache.xmlbeans.metadata:mypackage.metadata" to change the metadata directory
    -copyann - copy schema annotations to javadoc (default false) - don't activate on untrusted schema sources!
    -sourcecodeencoding [encodingName] - Generate Java source code with the specified encoding (ISO-8859-1 is the legacy default)

💡 技术拓展:网上旧资料(XMLBeans 2.x/3.x 时代)给出的 -help 常含 -javasource、-sxconly、-params、-extjars、-javaargs、-localCatalog 等选项,5.4.1 实测已全部移除,传参即报 Unrecognized option(详见《scomp 编译与进阶实战详解》3.1.4 节)。

编译:

# java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.SchemaCompiler -out order-xmlbeans.jar schema/order.xsd
2026-10-15T11:17:29.533550840Z main ERROR Log4j API could not find a logging provider.
Time to build schema type system: 0.387 seconds
Time to generate code: 0.048 seconds
Time to compile code: 1.0 seconds
Compiled types to: order-xmlbeans.jar
# echo $?
0

(首行 log4j 提示是因为只装了日志门面 log4j-api、未装 log4j-core 实现,不影响编译结果;消除方式见第七节。)

验证产物:

# ls -l order-xmlbeans.jar
-rw-r--r-- 1 root root 24367 Oct 15 11:17 order-xmlbeans.jar
# jar tf order-xmlbeans.jar | head -8
com/
com/example/
com/example/order/
com/example/order/OrderType.class
com/example/order/OrderDocument.class
com/example/order/impl/
com/example/order/impl/ItemTypeImpl.class
com/example/order/impl/OrderDocumentImpl.class
# jar tf order-xmlbeans.jar | wc -l
52

命名空间 http://example.com/order 被映射为 Java 包 com.example.order,包含 OrderDocument、OrderType、CustomerType、ItemType 等强类型接口,scomp 的进阶用法详见《Apache XMLBeans 5.4.1 scomp 编译与进阶实战详解》。

六、方案对比与选择建议

维度方案 A:Maven 依赖方案 B:jar 直用
安装成本一次 apt-get install maven,之后 mvn 全托管手工下载 3~4 个 jar 并维护类路径
传递依赖自动解析(log4j-api 2.26.1、xmlresolver 5.3.3)需手工补齐,缺一个就 NoClassDefFoundError
版本升级改 pom 版本号重新下载替换
适用场景任何有 Maven 的 Java 工程无外网的构建机、CI 沙箱、教学演示
本文结论生产首选离线补充

七、配置说明

7.1 JDK 版本切换

Ubuntu 的 update-alternatives 管理默认 java。多 JDK 时建议在脚本里显式导出,避免隐性切换:

# echo $JAVA_HOME

# export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
# echo $JAVA_HOME
/usr/lib/jvm/java-17-openjdk-amd64

未导出 JAVA_HOME 时 mvn 也能运行(它回落到 PATH 中的 java),但混装多 JDK 时极易踩到"mvn 用了旧 JDK"的坑,所以工程脚本里始终显式设置。

7.2 日志与编码

运行期出现的 Log4j API could not find a logging provider. 表示只有日志 API、没有日志实现。生产环境补一个实现即可消除:

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.26.1</version>
</dependency>

中文场景统一在 JVM 参数加 -Dfile.encoding=UTF-8(源文件用 javac -encoding UTF-8),否则在 ANSI_X3.4-1968 平台编码下中文会变问号——这是本文环境的真实默认值(见 4.2 节 mvn -v 输出)。

八、多版本管理

Maven 本地仓库按版本目录隔离多版本,互不干扰。演示拉一个历史版本共存:

# cd /work/mvn-demo
# mvn -q -B dependency:get -Dartifact=org.apache.xmlbeans:xmlbeans:2.6.0
# echo $?
0
# ls -1 ~/.m2/repository/org/apache/xmlbeans/xmlbeans/
2.6.0
5.4.1

切换版本只需改 pom 中 <version>(如改回 2.6.0 后 mvn clean compile 重新解析)。注意 2.6.0 与 5.x 的 API 有代差(如 XmlObject.getStringValue() 在 5.x 已不存在,见第九节),不建议在同一工程内混用两个版本线。

九、常见问题(FAQ)

Q1:运行时报 NoClassDefFoundError: org/apache/logging/log4j/Logger。 5.x 的 jar 必须搭配 log4j-api。jar 直用时漏带它就会复现。实测复现与修复:

# java -cp xmlbeans-5.4.1.jar org.apache.xmlbeans.impl.tool.SchemaCompiler -out bad.jar schema/order.xsd
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger
        at org.apache.xmlbeans.impl.common.XBeanDebug.<clinit>(XBeanDebug.java:126)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.Logger
        ... 1 more
# java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.SchemaCompiler -out order-xmlbeans.jar schema/order.xsd
Time to build schema type system: 0.387 seconds
...
Compiled types to: order-xmlbeans.jar

Q2:照抄旧教程调用 xmlObject.getStringValue() 编译失败。 XMLBeans 5.x 的 XmlObject 接口上已没有 getStringValue()(实测 javap org.apache.xmlbeans.XmlObject 无此方法),该方法在父链的 SimpleValue 接口上。写法改为:

((org.apache.xmlbeans.SimpleValue) id).getStringValue()

Q3:XmlOptions.setSavePretty() 方法找不到。 5.x 的缩进序列化方法是 setSavePrettyPrint()(实测 javap org.apache.xmlbeans.XmlOptions 仅返回 setSavePrettyPrint),旧方法名 setSavePretty() 已不存在。

Q4:XPath 表达式一用谓词就抛 NoClassDefFoundError: net/sf/saxon/sxpath/XPathStaticContext。 5.4.1 内置引擎只覆盖无谓词的简单路径,完整 XPath 2.0/XQuery 需要 Saxon-HE 12.10(及其传递依赖 xmlresolver),依赖与实测见《Apache XMLBeans 5.4.1 scomp 编译与进阶实战详解》第五节。

Q5:中文输出乱码。 mvn -v 显示 platform encoding: ANSI_X3.4-1968(POSIX locale),运行加 -Dfile.encoding=UTF-8、编译加 -encoding UTF-8 即可。

十、卸载与清理

# rm -rf /work/mvn-demo /work/schema /root/jar-run
# rm -rf ~/.m2/repository/org/apache/xmlbeans ~/.m2/repository/net/sf/saxon ~/.m2/repository/org/xmlresolver
# apt-get purge --dry-run openjdk-17-jdk
The following packages will be REMOVED:
Purg openjdk-17-jdk [17.0.20.1+1-1~22.04]

确认 --dry-run 列表无误后,把命令换成真实执行(apt-get purge -y openjdk-17-jdk)即可;保留 JDK 时只做前两步清理。

十一、参考链接