maven-jaxb2-plugin子项目无法扩展依赖jar中的基础XSD Schema
解决依赖XSD生成JAXB类时的类型解析问题
1. 确保基础XSD被正确打包进依赖Jar
ModelBase项目必须把basemodel.xsd打包到Jar的classpath中,否则test项目依赖后无法读取到该文件。在ModelBase的pom.xml中添加资源配置:
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>*.xsd</include> </includes> </resource> </resources> </build>
执行mvn clean install重新打包ModelBase,确保Jar中包含basemodel.xsd。
2. 配置test项目的maven-jaxb2-plugin加载依赖中的XSD
不要手动指定schemaLocation为本地文件路径,而是通过插件的dependencyResource直接从依赖Jar中加载XSD,同时在XSD的import中通过命名空间关联。
第一步:修改model2.xsd的import语句
去掉本地schemaLocation,只保留命名空间关联(确保命名空间与basemodel.xsd完全一致):
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tnsBaseModel="http://your-base-namespace" targetNamespace="http://your-test-namespace"> <!-- 仅指定命名空间,不写本地schemaLocation --> <xs:import namespace="http://your-base-namespace"/> <!-- 扩展基础类型 --> <xs:complexType name="ExtendedRequest"> <xs:complexContent> <xs:extension base="tnsBaseModel:requestBase"/> </xs:complexContent> </xs:complexType> </xs:schema>
第二步:配置test项目的maven-jaxb2-plugin
在插件配置中添加dependencyResource节点,指向ModelBase依赖中的basemodel.xsd:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.14.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <schemas> <!-- 加载本地的model2.xsd --> <schema> <fileset> <directory>src/main/resources</directory> <includes> <include>model2.xsd</include> </includes> </fileset> </schema> <!-- 从依赖Jar中加载basemodel.xsd --> <schema> <dependencyResource> <groupId>your.group.id</groupId> <artifactId>ModelBase</artifactId> <version>your-modelbase-version</version> <resource>basemodel.xsd</resource> </dependencyResource> </schema> </schemas> <generatePackage>com.your.package.test</generatePackage> </configuration> </plugin>
3. 排查常见问题
- 执行
mvn clean compile清理缓存后重新编译,避免旧编译文件干扰 - 确认ModelBase的Jar已安装到本地Maven仓库(执行过
mvn install) - 检查maven-jaxb2-plugin版本,建议使用0.14.0及以上版本,旧版本可能不支持
dependencyResource特性 - 核对两个XSD的命名空间,确保
tnsBaseModel前缀绑定的命名空间与basemodel.xsd的targetNamespace完全一致
内容的提问来源于stack exchange,提问作者ggallo
相关产品推荐
相关产品推荐

