Apache XMLBeans 5.4.1 scomp 编译与进阶实战详解

本文以 Apache XMLBeans 5.4.1 为对象,在 Ubuntu 22.04 实测环境下详解 scomp 编译器(SchemaCompiler 主类)的调用方式、产物结构、失败样例、CLI 校验器与 JDK 8/17 兼容性,全部命令与回显真实可复现。

Apache XMLBeansApache XMLBeans2026/10/15

Apache XMLBeans 5.4.1 scomp 编译与进阶实战详解

目标:在 Ubuntu 22.04 + OpenJDK 17/8 双 JDK 环境下,实测 Apache XMLBeans 5.4.1 的 scomp 编译器全流程(调用方式、选项、产物、失败样例)、CLI 实例校验器与 Saxon 查询引擎分层,全部代码与回显真实可复现。

一、环境信息

项值
操作系统Ubuntu 22.04.5 LTS(x86_64)
JDKOpenJDK 17.0.20.1(主)+ OpenJDK 1.8.0_504(兼容实测)
XMLBeansorg.apache.xmlbeans:xmlbeans:5.4.1(Maven Central 最新 release)
Saxonnet.sf.saxon:Saxon-HE:12.10 + org.xmlresolver:xmlresolver:5.3.3
工作目录/work(/work/schema 存放 XSD 与实例,/work/mvn-quick 为示例工程)

Schema 沿用订单示例(order.xsd 经 xs:include 引用 types.xsd,目标命名空间 http://example.com/order,完整内容见《Apache XMLBeans 5.4.1 快速入门与集成示例》第一节)。

二、scomp 工具总览

2.1 5.x 的现实:没有独立安装包,编译器就在主 jar 里

5.x 不再发布传统 bin 分发包:官方下载目录 downloads.apache.org/xmlbeans/ 已下线(404),archive.apache.org/dist/xmlbeans/binaries/ 最新只到 2.6.0。scomp 的全部能力内置在 Maven Central 的 xmlbeans-5.4.1.jar 中,命令行入口是主类 org.apache.xmlbeans.impl.tool.SchemaCompiler。

jar 内还有一个同名系类 org.apache.xmlbeans.impl.tool.XMLBean——实测它是 Ant 任务而非命令行入口:类继承 org.apache.tools.ant.taskdefs.MatchingTask,且没有 main 方法,直接调用会因缺 ant 依赖而加载失败:

# java -cp xmlbeans-5.4.1.jar org.apache.xmlbeans.impl.tool.XMLBean
Error: Could not find or load main class org.apache.xmlbeans.impl.tool.XMLBean
Caused by: java.lang.NoClassDefFoundError: org/apache/tools/ant/taskdefs/MatchingTask

结论:命令行一律用 SchemaCompiler(实测带 public static void main(String[]));XMLBean 类仅在 Ant 构建里配合 ant.jar 使用。

2.2 工具自述与版本

# java -cp xmlbeans-5.4.1.jar org.apache.xmlbeans.impl.tool.SchemaCompiler -version
org.apache.xmlbeans, Apache XmlBeans.XmlBeans version 5.4.1
# 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(3.1.4 节复现)。选参数时以本文这份实测清单为准。

2.3 前置依赖

scomp 运行期必须带 log4j-api(XMLBeans 5.x 日志门面),生成 Java 代码后的"编译代码"步骤走 JDK 内置的 javax.tools 编译器,因此必须在 JDK(含 javac)而非 JRE 上运行。两者缺一都会失败,复现见 3.1.2 与第七节。

三、scomp 编译实战

3.1 基本编译:XSD → jar

3.1.1 成功路径

# cd /work
# 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
Time to generate code: 0.048 seconds
Time to compile code: 1.0 seconds
Compiled types to: order-xmlbeans.jar
# echo $?
0

三个阶段耗时(类型系统构建 → Java 源生成 → 代码编译)与退出码 0 都实测可复现。order.xsd 只传了主文件,它 include 的 types.xsd 被自动解析带入(见 3.2 节产物验证)。

3.1.2 缺 log4j-api 的失败复现

# 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

类路径补上 log4j-api-2.26.1.jar 后即为 3.1.1 的成功输出。注意 -help 这类不触发日志初始化的操作不需要 log4j-api(第二节 -help 实测未带它也能跑)。

3.1.3 目录模式(-src / -d)

不打包 jar,分别拿源码与 class:

# cd /work
# java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.SchemaCompiler -quiet -src gen-src -d gen-classes schema/order.xsd
# echo $?
0
# ls gen-classes/com/example/order/
AddressType.class
CustomerType.class
ItemType.class
OrderDocument.class
OrderType.class
impl
# ls gen-src/com/example/order/*.java | head -6
gen-src/com/example/order/AddressType.java
gen-src/com/example/order/CustomerType.java
gen-src/com/example/order/ItemType.java
gen-src/com/example/order/OrderDocument.java
gen-src/com/example/order/OrderType.java

gen-classes 下还有 org/ 目录(类型系统元数据 .xsb)。对生成源码做二次加工(加注释、替换包名)后,可用 javac 自行编译,或直接 -out 交给 scomp 打包。

3.1.4 失败样例与真实退出码

构造一个引用不存在类型的坏 Schema /work/schema/bad.xsd(<xs:element name="order" type="ord:OrderTypo"/>):

# java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.SchemaCompiler -out bad.jar schema/bad.xsd
bad.xsd:6:49: error: src-resolve: type 'OrderTypo@http://example.com/order' not found.
Time to build schema type system: 0.4 seconds
BUILD FAILED
# java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.SchemaCompiler -out bad.jar schema/bad.xsd >/dev/null 2>&1
# echo $?
1

要点:错误信息带 文件:行:列 定位(6:49 正是 OrderTypo 出现的位置);退出码 1 可直接用于脚本判断;失败时不产生任何 jar。

同一个命令若带上 5.4.1 已不存在的选项(如旧资料常见的 -javasource 1.8),实测直接报错并打印完整用法清单:

# java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.SchemaCompiler -out order-js18.jar -javasource 1.8 schema/order.xsd
Unrecognized option: -javasource
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)

(这份报错后的清单与 -help 输出逐行一致,即 unrecognized 选项只是复述用法;-javasource 在 5.4.1 已不存在。)

3.2 产物结构验证

# 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
# jar tf order-xmlbeans.jar | grep -E 'schemaorg|metadata/src' | head -4
org/apache/xmlbeans/metadata/system/s12905AACA0B66CA5F2D25AAAD93C5E2F/TypeSystemHolder.class
org/apache/xmlbeans/metadata/system/s12905AACA0B66CA5F2D25AAAD93C5E2F/index.xsb
org/apache/xmlbeans/metadata/src/order.xsd
org/apache/xmlbeans/metadata/src/types.xsd

三条关键事实:

  1. 包名映射:命名空间 http://example.com/order → com.example.order,全局元素 order 生成 OrderDocument,四个命名类型各生成同名接口 + impl 实现类。
  2. include 自动带入:metadata/src 下同时有 order.xsd 与 types.xsd,说明 xs:include 被完整解析(3.3 节的显式双文件编译是它的对照实验)。
  3. 类型系统指纹:system/s12905AACA0B66CA5F2D25AAAD93C5E2F 目录名是内容摘要,Schema 内容变化会生成新目录名;TypeSystemHolder 是运行期加载入口(getContextTypeLoader().findElement 等 API 的数据源)。

3.2.1 显式双文件编译(对照实验)

# java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.SchemaCompiler -quiet -out order-two.jar schema/types.xsd schema/order.xsd
# echo $?
0
# ls -l order-two.jar
-rw-r--r-- 1 root root 24387 Oct 15 12:03 order-two.jar

多个 XSD(或 WSDL)可以并列传入,退出码 0、产物 24387 字节与单文件版(24367)几乎一致——因为类型集合相同,仅元数据组织略有差异。日常建议仍以"传入口文件 + include 自动解析"为主,避免把同一类型编译进多个类型系统。

3.3 与 Maven 工程的集成

生成的 jar 用 install:install-file 进本地仓库后即可作为普通依赖引用(命令与 dependency:tree 回显见《快速入门》4.2 节)。由于 scomp 在"编译代码"阶段使用 JDK 内置编译器,同一 jar 在 JDK 17 上生成时字节码仍锁定 Java 8(4.1 节实测),CI 机器 JDK 版本不影响产物兼容性。

四、生成 jar 的使用要点

4.1 字节码基线实测

在 JDK 17 上执行 scomp,抽出生成的 OrderDocument.class 反查版本:

# mkdir -p /tmp/ex && cd /tmp/ex
# jar xf /work/order-xmlbeans.jar com/example/order/OrderDocument.class
# od -An -tu1 -N8 com/example/order/OrderDocument.class | awk '{print "major="$8}'
major=52

major=52 即 Java 8:scomp 生成代码的目标版本与运行 scomp 的 JDK 无关,恒为 Java 8 基线。这决定了"一次生成、JDK 8/11/17 通吃"的部署方式,也是第七节 JDK 8 回退方案的可行性依据(XMLBeans 主 jar 同样是 major=52,javap -v 实测同值)。

4.2 生成类的 API 面

对生成接口做 javap 自省(节选):

# javap -cp /work/order-xmlbeans.jar com.example.order.OrderType | head -6
public interface com.example.order.OrderType extends org.apache.xmlbeans.XmlObject {
  public static final org.apache.xmlbeans.SchemaType type;
  public abstract java.lang.String getId();
  public abstract org.apache.xmlbeans.XmlString xgetId();
  public abstract void setId(java.lang.String);
  public abstract void xsetId(org.apache.xmlbeans.XmlString);

每个属性生成四个方法:普通 getter/setter(Java 原生类型)与 x 前缀版本(XmlString 等类型化对象),列表属性额外有 addNewItem()/getItemList()。这个 SchemaType type 静态字段就是第六节 Schema 自省的类型来源。

五、XPath/XQuery 引擎分层(Saxon 边界实测)

5.4.1 内置一个 XPath 子集引擎处理无谓词的简单路径;带谓词([])的路径在编译期回退到 Saxon 引擎。用《快速入门》第五节的 QueryDemo 做三态实测:

类路径简单路径谓词路径实测结论
仅 xmlbeans + log4j-api命中NoClassDefFoundError: net/sf/saxon/sxpath/XPathStaticContext内置引擎兜底简单路径
+ Saxon-HE 12.10命中NoClassDefFoundError: org/xmlresolver/ResolverSaxon 还要 xmlresolver
+ Saxon-HE + xmlresolver 5.3.3命中命中完整 XPath 2.0 / XQuery 可用

三段真实报错(第一段与第三段的完整回显见《快速入门》5.1/5.2 节):

Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/saxon/sxpath/XPathStaticContext
        at org.apache.xmlbeans.impl.xpath.XPathFactory.getCompiledPathSaxon(XPathFactory.java:142)
        ...
Exception in thread "main" java.lang.NoClassDefFoundError: org/xmlresolver/Resolver
        at net.sf.saxon.lib.CatalogResourceResolver.<init>(CatalogResourceResolver.java:46)
        at net.sf.saxon.Configuration.init(Configuration.java:387)
        ...

Maven 方式下 Saxon-HE:12.10 的 POM 会传递带入 xmlresolver:5.3.3,无需手工处理;手工拼类路径(jar 直跑)必须两个都带。另有一个实测行为坑:无类型解析(未绑定 Schema)的文档里,order by $i/ord:price 按字符串比较排序("399.0" > "1899.0"),需写 xs:double($i/ord:price) 显式转换,复现与修复对照见《快速入门》5.3 节。

六、实例校验:CLI 与编程式双通道

6.1 CLI 校验器 InstanceValidator

jar 内还带一个独立的实例校验工具,用法自述:

# java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.InstanceValidator
Compiles a schema into XML Bean classes and metadata.
Usage: validate [-dl] [-nopvr] [-noupa] [-license] schema.xsd instance.xml

对合法与非法实例各实测一次(非法实例缺必填属性 id,且 qty="abc"):

# cd /work
# java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.InstanceValidator schema/order.xsd schema/order.xml
schema/order.xml valid.
# java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.InstanceValidator schema/order.xsd schema/order-invalid.xml
schema/order-invalid.xml NOT valid.
/work/schema/order-invalid.xml:2:66: error: cvc-complex-type.4: Expected attribute: id in element order@http://example.com/order
/work/schema/order-invalid.xml:12:37: error: decimal: Invalid decimal value: unexpected char '97'
# java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.InstanceValidator schema/order.xsd schema/order-invalid.xml >/dev/null 2>&1
# echo $?
1

三个要点:错误信息带精确行列号(2:66、12:37);退出码 1/0 可直接进脚本;该工具不需要生成类型 jar——它现场编译传入的 schema.xsd(实测去掉 order-xmlbeans.jar 后回显不变),适合 CI 里对 XML 实例做纯校验。

6.2 编程式 validate()

XmlObject.validate(XmlOptions) + 错误监听器的实测输出(《快速入门》TypedDemo 的非法实例部分):

validate = false errors = 2
  line -1, col -1: Expected attribute: id in element order@http://example.com/order
  line -1, col -1: Invalid decimal value: unexpected char '97'

错误内容与 CLI 一致,但 line/col 为 -1——这是 validate() 错误监听器的实测行为(XmlError 未附加位置)。需要行列号时用 6.1 的 CLI 通道;需要把错误接入业务逻辑(如收集后统一处理)时用监听器通道。

七、JDK 兼容性实测

7.1 双 JDK 全流程

同一台服务器装了 OpenJDK 17.0.20.1 与 OpenJDK 1.8.0_504(apt 包 openjdk-8-jdk),对 scomp 与运行期分别实测:

# /usr/lib/jvm/java-8-openjdk-amd64/bin/java -version
openjdk version "1.8.0_504"
OpenJDK Runtime Environment (build 1.8.0_504-8u504-ga-1ubuntu1~22.04.3-b01)
OpenJDK 64-Bit Server VM (build 25.504-b01, mixed mode)
# /usr/lib/jvm/java-8-openjdk-amd64/bin/java -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar org.apache.xmlbeans.impl.tool.SchemaCompiler -out order-jdk8.jar schema/order.xsd
Time to build schema type system: 0.463 seconds
Time to generate code: 0.045 seconds
Time to compile code: 0.723 seconds
Compiled types to: order-jdk8.jar
# echo $?
0

JDK 8 下 javac 编译示例类并运行(含 Saxon 的 XPath/XQuery):

# /usr/lib/jvm/java-8-openjdk-amd64/bin/javac -encoding UTF-8 -cp xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar:order-xmlbeans.jar:Saxon-HE-12.10.jar:xmlresolver-5.3.3.jar -d out8 mvn-quick/src/main/java/demo/*.java
# echo $?
0
# /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Dfile.encoding=UTF-8 -cp out8:xmlbeans-5.4.1.jar:log4j-api-2.26.1.jar:order-xmlbeans.jar:Saxon-HE-12.10.jar:xmlresolver-5.3.3.jar demo.TypedDemo
id = A-2026-1015 date = Thu Oct 15 00:00:00 GMT 2026
customer = 张伟 <zhangwei@example.com> vip = true
地址 = 广东省 深圳市 科技园南路 88 号
item SKU-1001 qty=2 price=399.0 name=机械键盘
...
合计 = 3474.0
---- 修改并校验 ----
validate = true errors = 0

结论:XMLBeans 5.4.1 主 jar(major=52)、scomp 生成 jar(major=52)在 JDK 8 与 17 上行为一致;官方"JDK 8+"基线在本环境双向实测成立。CentOS 8 平台的补充实测(1.8.0_312 + 17.0.1)见《CentOS 8 安装 Apache XMLBeans 指南》第五节。

7.2 类版本错误的真实边界

兼容性只覆盖 XMLBeans 的 jar 与生成 jar——业务代码自己决定字节码目标。把示例类用 release 17 编译(major=61)后放到 JDK 8 上运行,实测直接被拒:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: demo/TypedDemo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0

所以"JDK 8 回退方案"的正确姿势是:运行在 JDK 8 的机器上用 JDK 8 的 javac(或 pom 里 maven.compiler.release=8)编译业务代码;XMLBeans 侧无需任何特殊处理。

八、注意事项

  1. scomp 必须在 JDK 上运行:生成代码的编译走 javax.tools,JRE-only 环境拿不到系统编译器;报错前先确认 javac 存在(which javac)。
  2. log4j-api 是运行期硬依赖:命令行与内嵌调用都算;漏带时 XBeanDebug 类初始化即抛 NoClassDefFoundError(3.1.2 实测)。
  3. 旧资料选项在 5.4.1 已移除:-javasource、-sxconly、-params 等旧版选项传参即报 Unrecognized option(3.1.4 实测);选项以本文实测 -help 清单为准,拿不准就先用最小参数集(-out + XSD)实测。
  4. 错误定位选对通道:CLI 校验器给行列号,validate() 监听器给错误对象但无行列号(6.2);脚本化 CI 建议用 CLI + 退出码。
  5. 类型系统目录名是内容摘要:s12905AACA... 会随 Schema 内容变化,构建脚本不要把该目录名写死进配置。

九、常见问题(FAQ)

Q1:报 Could not find or load main class org.apache.xmlbeans.impl.tool.XMLBean。 调错了类:XMLBean 是 Ant 任务(继承 MatchingTask),命令行入口是 org.apache.xmlbeans.impl.tool.SchemaCompiler(2.1 节实测复现)。

Q2:scomp 报 NoClassDefFoundError: org/apache/logging/log4j/Logger。 类路径缺 log4j-api,补 log4j-api-2.26.1.jar 即可(3.1.2 实测)。

Q3:生成的 jar 在 JDK 8 上报 UnsupportedClassVersionError。 先分清是哪个 jar:XMLBeans/生成 jar 都是 major=52,不会报;报错的是业务类(如用 release 17 编译的 demo 类,7.2 实测原文)。把业务编译目标降到 8 即可。

Q4:XPath 简单路径能用、带 [] 的路径报错。 5.4.1 的引擎分层行为(第五节三态实测表):补齐 Saxon-HE 12.10 + xmlresolver 5.3.3。

Q5:旧教程里的 -javasource 1.5/-javasource 1.8 参数为什么报 Unrecognized option? 5.4.1 已彻底移除该选项,-help 清单里也没有它(2.2/3.1.4 实测原文);生成代码已固定 Java 8 目标,无需该选项。

十、参考链接