使用org.jvnet.jaxb的jaxb-maven-plugin处理嵌套XSD导入的配置咨询
org.jvnet.jaxb的jaxb-maven-plugin处理嵌套XSD导入的配置咨询
我来帮你搞定这个XSD嵌套导入的配置问题!先再明确下你的场景:
- 你有两个基础XSD文件:
sample1.xsd和sample2.xsd,分别生成对应com.sample1和com.sample2包下的Java类 - 还有一个
master.xsd,它通过类似下面的语句导入了上述两个XSD:
<xs:import namespace="urn:iso:std:iso:20022:tech:xsd:sample1.001.001.04" schemaLocation="iso/sample1.001.001.04.xsd" />
现在需要用jaxb-maven-plugin处理整个依赖关系,保证生成的类能正确关联
接下来直接上可复用的Maven配置,都是我踩过坑后总结的实用方案:
首先在你的pom.xml里配置jaxb-maven-plugin,核心是要指定所有XSD的目录、命名空间与包名的映射,同时处理导入依赖:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>0.14.0</version> <!-- 建议用稳定的最新版本,避免旧版本BUG --> <executions> <execution> <id>generate-all-xsds</id> <goals> <goal>generate</goal> </goals> <configuration> <!-- 所有XSD文件的根目录,要包含master.xsd和被导入的sample1/sample2.xsd --> <schemaDirectory>${project.basedir}/src/main/resources/xsd</schemaDirectory> <!-- 可以单独指定要处理的主XSD,也可以用includes匹配所有需要的文件 --> <schemaIncludes> <include>master.xsd</include> <include>sample1.xsd</include> <include>sample2.xsd</include> </schemaIncludes> <!-- 命名空间到包名的映射,也可以用绑定文件更灵活配置 --> <packageName>com.master</packageName> <!-- master生成类的目标包 --> <bindings> <binding> <fileset> <directory>${project.basedir}/src/main/resources/xsd</directory> <includes> <include>bindings.xjb</include> <!-- 可选绑定文件,精准配置每个XSD的包名 --> </includes> </fileset> </binding> </bindings> <!-- 关键配置:开启依赖处理,自动识别XSD导入关系 --> <strict>false</strict> <extension>true</extension> <args> <!-- 解决导入时的命名冲突,递归处理依赖XSD --> <arg>-XautoNameResolution</arg> <!-- 不生成公共package-info,避免和已有的sample1/sample2类冲突 --> <arg>-npa</arg> </args> </configuration> </execution> </executions> </plugin>
如果你想更精准地给每个XSD指定包名,可以用bindings.xjb绑定文件,把它放在和XSD同目录下:
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" jaxb:extensionBindingPrefixes="xjc"> <!-- 为sample1的命名空间指定对应包名 --> <jaxb:bindings schemaLocation="sample1.xsd" node="/xs:schema"> <jaxb:schemaBindings> <jaxb:package name="com.sample1"/> </jaxb:schemaBindings> </jaxb:bindings> <!-- 为sample2的命名空间指定对应包名 --> <jaxb:bindings schemaLocation="sample2.xsd" node="/xs:schema"> <jaxb:schemaBindings> <jaxb:package name="com.sample2"/> </jaxb:schemaBindings> </jaxb:bindings> <!-- 为master的命名空间指定对应包名 --> <jaxb:bindings schemaLocation="master.xsd" node="/xs:schema"> <jaxb:schemaBindings> <jaxb:package name="com.master"/> </jaxb:schemaBindings> </jaxb:bindings> </jaxb:bindings>
最后再给你几个关键提醒:
- 确保
schemaDirectory路径正确,要覆盖所有XSD所在的目录(包括子目录的话可以用通配符) - 如果已经单独生成过sample1和sample2的类,可以拆分两个execution:先处理基础XSD,再处理master,保证生成顺序
- 插件版本尽量选最新稳定版,旧版本可能存在导入依赖识别不全的问题
备注:内容来源于stack exchange,提问作者lryk
相关产品推荐
相关产品推荐

