迁移至Java21与JAXB3后,从WSDL生成类时出现jxb前缀未绑定异常如何解决?
解决Java21+JAXB3迁移中jaxb-maven-plugin生成类的SAXParseException异常
问题场景
从Java8(JAXB2)迁移到Java21(JAXB3)后,使用jaxb-maven-plugin从WSDL生成Java类时,触发org.xml.sax.SAXParseException异常,错误信息为:
元素jxb:bindings的前缀jxb未绑定
导致Maven构建直接失败。
旧配置参考
旧xjb绑定文件头部
<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> <!-- 自定义绑定规则 --> </jxb:bindings>
旧Maven插件配置
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb-maven-plugin</artifactId> <version>2.5.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <wsdlFiles> <wsdlFile>src/main/resources/your-service.wsdl</wsdlFile> </wsdlFiles> <bindingFiles> <bindingFile>src/main/resources/bindings.xjb</bindingFile> </bindingFiles> </configuration> </execution> </executions> </plugin>
解决方案
1. 更新xjb绑定文件的命名空间与版本
JAXB3属于Jakarta EE生态,命名空间已从原Sun的地址迁移到Jakarta官方地址,同时版本号需对应3.0。修改xjb文件头部如下:
<jxb:bindings xmlns:jxb="https://jakarta.ee/xml/ns/jaxb" version="3.0"> <!-- 原有自定义绑定规则保持不变 --> </jxb:bindings>
这一步是解决“前缀jxb未绑定”的核心——旧命名空间在JAXB3环境下无法被插件识别,导致前缀绑定失败。
2. 升级Maven插件并添加jaxb-basics依赖
旧的org.codehaus.mojo版本jaxb-maven-plugin不支持JAXB3,需替换为org.jvnet.jaxb.maven2的适配版本,同时添加jaxb-basics-annotate插件处理注解绑定(JAXB3移除了部分旧API,需要该插件补充):
<plugin> <groupId>org.jvnet.jaxb.maven2</groupId> <artifactId>jaxb-maven-plugin</artifactId> <version>3.0.2</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <wsdlFiles> <wsdlFile>src/main/resources/your-service.wsdl</wsdlFile> </wsdlFiles> <bindingFiles> <bindingFile>src/main/resources/bindings.xjb</bindingFile> </bindingFiles> <!-- 开启扩展以加载jaxb-basics插件 --> <extension>true</extension> <args> <arg>-Xannotate</arg> </args> </configuration> <dependencies> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics-annotate</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics</artifactId> <version>1.11.1</version> </dependency> </dependencies> </execution> </executions> <!-- 引入JAXB3核心依赖 --> <dependencies> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>3.0.1</version> </dependency> </dependencies> </plugin>
完成以上两步后,重新执行Maven构建即可成功生成JAXB3兼容的Java类。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

