如何强制JAXB2遵循含include的XSD文件的引入顺序?
解决jaxb2-maven-plugin不遵循XSD引入顺序导致的类型找不到问题
问题场景
我有一个主XSD文件,负责引入其他所有XSD:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:include schemaLocation="z-common.xsd"/> <xs:include schemaLocation="a-first.xsd"/> <xs:include schemaLocation="b-second.xsd"/> <xs:include schemaLocation="c-third.xsd"/> </xs:schema>
其中z-common.xsd定义了共用的复杂类型:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="MyType"> <xs:all> <xs:element minOccurs="1" type="xs:string" name="attr1"/> <xs:element minOccurs="1" type="xs:string" name="attr2"/> </xs:all> </xs:complexType> </xs:schema>
其余XSD文件(如a-first.xsd)均依赖这个MyType:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="MyObject"> <xs:all> <xs:element minOccurs="0" type="MyType" name="myType"/> </xs:all> </xs:complexType> </xs:schema>
使用jaxb2-maven-plugin构建时,插件会忽略主XSD中的引入顺序,按字母顺序处理文件(先处理a-first.xsd,再到z-common.xsd),导致报错找不到MyType,且无法修改现有XSD文件。
解决方案
直接在maven插件配置中显式指定XSD文件的处理顺序,将依赖的基础XSD(z-common.xsd)放在最前面,确保它先被编译生成对应的Java类,后续XSD就能找到依赖类型。
修改pom.xml中的jaxb2-maven-plugin配置:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.5.0</version> <!-- 使用合适的版本 --> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <!-- 按顺序列出所有XSD文件,基础依赖在前 --> <sources> <source>src/main/resources/z-common.xsd</source> <source>src/main/resources/a-first.xsd</source> <source>src/main/resources/b-second.xsd</source> <source>src/main/resources/c-third.xsd</source> </sources> </configuration> </plugin>
这样插件会严格按照sources标签内的顺序处理XSD文件,先编译z-common.xsd生成MyType对应的Java类,后续处理依赖XSD时就能正确识别该类型。
如果XSD文件数量较多,也可以通过配置<includes>结合文件排序,但显式指定顺序是最直接可靠的方式,无需修改任何XSD内容。
内容的提问来源于stack exchange,提问作者Broshet
相关产品推荐
相关产品推荐

