升级Jakarta JAXB后继承命名空间不支持问题求助
Jakarta JAXB 3.x 继承插件配置问题解决
问题背景
将XSD转换为Java文件,升级至Jakarta JAXB后,配置继承扩展时遇到命名空间不支持的报错。
现有配置
XJB绑定文件配置
<jaxb:bindings version="3.0" xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" jaxb:extensionBindingPrefixes="inheritance"> <jaxb:globalBindings> <xjc:simple /> <jaxb:javaType name="java.lang.String" xmlType="xs:date" /> <jaxb:javaType name="java.lang.String" xmlType="xs:time" /> <jaxb:serializable /> </jaxb:globalBindings> <jaxb:bindings schemaLocation="&xsdPath;/sample.xsd"> <jaxb:bindings node="//xs:element[@name='sampleRequest']/xs:complexType"> <inheritance:implements>&baseRequest;</inheritance:implements> </jaxb:bindings> <jaxb:bindings node="//xs:element[@name='sampleResponse']/xs:complexType"> <inheritance:implements>&baseResponse;</inheritance:implements> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
Maven插件配置
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>xjc</id> <goals><goal>xjc</goal> </goals> </execution> </executions> <configuration> <args> <arg>-Xinject-code</arg> <arg>-Xinheritance</arg> <arg>-XautoNameResolution</arg> </args> <dependencies> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>4.0.3</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>4.0.3</version> </dependency> </dependencies> <xjbSources> <xjbSource>src/main/resources/schema/xjb/MyJaxbBindings.xjb</xjbSource> </xjbSources> <sources> <source>src/main/resources/schema/xsd</source> </sources> <packageName>com.demo.generated.model</packageName> <outputDirectory>${project.build.directory}/generated-sources/jaxb</outputDirectory> <clearOutputDir>false</clearOutputDir> <noGeneratedHeaderComments>true</noGeneratedHeaderComments> <extension>true</extension> <generateEpisode>false</generateEpisode> </configuration> </plugin>
报错现象
- 初始构建报错:
"Unsupported binding namespace http://jaxb2-commons.dev.java.net/basic/inheritance. Perhaps you meant http://jaxb.dev.java.net/plugin/code-injector?"
- 错误替换命名空间后,再次报错:
"Using http://jaxb.dev.java.net/plugin/code-injector customizations requires the "-Xinject-code" switch to enable this plug-in."
解决步骤
1. 补充继承插件依赖
在Maven插件的<dependencies>节点中添加适配Jakarta JAXB 3.x的继承扩展包:
<dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics</artifactId> <version>1.12.0</version> </dependency> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics-tools</artifactId> <version>1.12.0</version> </dependency>
2. 恢复XJB文件的正确命名空间
将XJB文件中inheritance的命名空间恢复为http://jaxb2-commons.dev.java.net/basic/inheritance,无需替换为代码注入插件的命名空间——两者属于不同扩展,不能混用。
3. 重新执行构建
保持Maven插件<args>中的-Xinheritance参数不变,执行mvn clean compile即可正常生成带有继承实现的Java类。
内容的提问来源于stack exchange,提问作者SreeNath
相关产品推荐
相关产品推荐

