jaxb2-maven-plugin生成XSD时忽略命名空间:两个类存在相同XML类型问题
解决Java 11迁移中jaxb2-maven-plugin忽略命名空间的XSD生成问题
我之前遇到过几乎一模一样的问题!当时也是从Java 8迁到Java 11,用jaxb2-maven-plugin 2.x生成XSD时碰到了这个命名空间识别的bug,折腾了好一阵才搞定。
问题根源
你用的org.codehaus.mojo:jaxb2-maven-plugin:2.5.0是为Java EE时代的JAXB(javax.xml.bind)设计的,而现在你依赖的是Jakarta EE的JAXB 3.x(jakarta.xml.bind)——旧版本插件无法正确识别Jakarta注解里的namespace属性,所以把两个不同命名空间下的Toyota类当成了重复的XML类型。
解决方案
直接升级插件到支持Jakarta EE的3.x版本就可以解决这个问题,我当时用的是3.1.0版本(目前稳定且兼容性良好),具体修改如下:
修改pom.xml中的插件版本
把插件的版本从2.5.0替换为3.1.0,其余配置可以保持不变:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>3.1.0</version> <!-- 升级到支持Jakarta的版本 --> <executions> <execution> <id>schemagen</id> <goals> <goal>schemagen</goal> </goals> <phase>generate-resources</phase> </execution> </executions> <configuration> <sources> <source>src/main/java/org/example/car</source> <source>src/main/java/org/example/bus</source> </sources> <outputDirectory>schemas</outputDirectory> <transformSchemas> <transformSchema> <uri>https://car.example.org/</uri> <toFile>car.xsd</toFile> </transformSchema> <transformSchema> <uri>https://bus.example.org/</uri> <toFile>bus.xsd</toFile> </transformSchema> </transformSchemas> </configuration> </plugin>
可选:添加调试参数(如果升级后仍有问题)
如果升级后还是遇到异常,可以添加参数强制schemagen识别命名空间并输出详细日志:
<configuration> <!-- 保留原有配置 --> <arguments> <argument>-npa</argument> <!-- 禁止生成重复的package-info.java --> <argument>-verbose</argument> <!-- 输出详细日志,方便排查问题 --> </arguments> </configuration>
验证方法
运行命令:
mvn clean generate-resources
正常情况下,插件会正确识别两个类的命名空间,生成car.xsd和bus.xsd,不会再报Two classes have the same XML type name "toyota"的错误。
内容的提问来源于stack exchange,提问作者WorkingAccount
相关产品推荐
相关产品推荐

