如何创建引用独立JAR依赖中另一个XSD的XSD文件
问题解决方案
1. 正确实现XSD引用的两种方法
方法一:使用Catalog映射命名空间(适合直接引用XSD的场景)
步骤1:配置module_A对module_B的依赖
在module_A的pom.xml中添加module_B的依赖,确保编译时能获取到module_B的JAR资源:
<dependency> <groupId>你的项目groupId</groupId> <artifactId>module_B</artifactId> <version>对应版本号</version> </dependency>
步骤2:创建Catalog文件
在module_A的src/main/resources下新建catalog.cat文件,映射XSD_B的命名空间到类路径中的XSD文件:
PUBLIC "http://my.own.targetNamespace" "classpath:/XSD_B.xsd"
注:XSD_B位于module_B的resources目录,打包后会在JAR根目录,所以路径为/XSD_B.xsd。
步骤3:配置XJC插件引用Catalog
修改module_A中maven-jaxb2-plugin的配置,指定catalog文件路径:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <schemas> <schema> <file>src/main/resources/XSD_A.xsd</file> </schema> </schemas> <catalog>src/main/resources/catalog.cat</catalog> </configuration> </execution> </executions> </plugin>
步骤4:修改XSD_A的引用
XSD_A中仅需指定命名空间,无需写本地路径:
<xs:import namespace="http://my.own.targetNamespace"/>
方法二:使用Episode复用已生成的Java类(更高效,避免重复编译)
这种方式会让module_A直接复用module_B编译XSD_B生成的Java类,无需再次解析XSD_B。
步骤1:在module_B中配置生成Episode
修改module_B的maven-jaxb2-plugin配置,开启episode生成:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <schemas> <schema> <file>src/main/resources/XSD_B.xsd</file> </schema> </schemas> <generateEpisode>true</generateEpisode> </configuration> </execution> </executions> </plugin>
打包后module_B的JAR会包含META-INF/jaxb/episode.xsd文件。
步骤2:在module_A中引用Episode
修改module_A的maven-jaxb2-plugin配置,引入module_B的episode:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <schemas> <schema> <file>src/main/resources/XSD_A.xsd</file> </schema> </schemas> <episodes> <episode> <groupId>你的项目groupId</groupId> <artifactId>module_B</artifactId> </episode> </episodes> </configuration> </execution> </executions> </plugin>
步骤3:修改XSD_A的引用
同样只需指定命名空间即可:
<xs:import namespace="http://my.own.targetNamespace"/>
2. 非本地编译的构建兼容性
只要确保以下两点,非本地环境(如CI/CD流水线)可以正常构建:
- module_A的
pom.xml中正确配置了module_B的依赖,且module_B已发布到Maven仓库(或私有仓库) - 使用上述两种方法之一配置XJC插件
Maven会自动从仓库拉取module_B的JAR,XJC插件能从依赖JAR中读取所需的XSD或episode文件,无需本地存在XSD_B的物理文件。
内容的提问来源于stack exchange,提问作者dtchmnt
相关产品推荐
相关产品推荐

