
本文旨在帮助开发者解决在使用 Maven CXF 插件从 WSDL 文件生成 Java 代码时遇到的 javax/xml/bind/annotation/adapters/HexBinaryAdapter 缺失错误。文章将提供一个可行的 Maven 配置示例,并详细解释如何正确引入必要的 JAXB 依赖,以确保代码生成过程顺利进行。
在使用 Maven 的 CXF 插件 (cxf-codegen-plugin) 从 WSDL 文件生成 Java 代码时,你可能会遇到与 JAXB (Java Architecture for XML Binding) 相关的错误,特别是在使用 Java 11 及更高版本时。 这是因为 Java 11 移除了 javax.xml.bind 模块,需要显式引入 JAXB 的替代实现。以下提供一种可行的解决方案,通过调整 Maven 配置和引入正确的依赖项来解决这个问题。
Maven 配置示例
以下是一个完整的 pom.xml 文件示例,展示了如何配置 jaxb2-maven-plugin 插件来从 WSDL 文件生成 Java 代码,并包含了必要的 JAXB 依赖项。
4.0.0 org.springframework.boot spring-boot-starter-parent 3.0.6 com.example.project awi 0.0.1-SNAPSHOT war awi awi 17 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-devtools runtime org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine org.springframework.boot spring-boot-starter-tomcat provided org.projectlombok lombok true org.springdoc springdoc-openapi-starter-webmvc-ui 2.1.0 org.apache.commons commons-lang3 org.springframework.boot spring-boot-starter-tomcat provided org.springframework.boot spring-boot-starter-test test org.apache.httpcomponents.client5 httpclient5 5.2.1 jakarta.xml.ws jakarta.xml.ws-api 3.0.0 com.sun.xml.ws jaxws-rt 3.0.0 jakarta.xml.bind jakarta.xml.bind-api 3.0.0 org.glassfish.jaxb jaxb-runtime 4.0.2 exampleName org.springframework.boot spring-boot-maven-plugin org.codehaus.mojo jaxb2-maven-plugin 3.1.0 xjc xjc wsdl ${project.basedir}/src/main/resources/wsdl ${project.basedir}/src/main/java false com.example.soap.objects true
关键点说明:
立即学习“Java免费学习笔记(深入)”;
- JAXB 依赖: 确保包含 jakarta.xml.bind-api 和 org.glassfish.jaxb:jaxb-runtime 依赖项。 这些依赖项提供了 JAXB API 的实现,解决了 Java 11+ 中 JAXB 缺失的问题。 示例中使用了 jakarta.xml.bind-api 的 3.0.0 版本和 org.glassfish.jaxb 的 4.0.2 版本,请根据实际情况选择合适的版本。
- jakarta.xml.ws 依赖: 包含 jakarta.xml.ws-api 和 com.sun.xml.ws:jaxws-rt 依赖项。 这些依赖项提供了 JAX-WS API 的实现。 示例中使用了 jakarta.xml.ws-api 的 3.0.0 版本和 com.sun.xml.ws 的 3.0.0 版本,请根据实际情况选择合适的版本。
- jaxb2-maven-plugin: 使用 org.codehaus.mojo:jaxb2-maven-plugin 而不是 org.apache.cxf:cxf-codegen-plugin。 这个插件专门用于从 XML Schema (XSD) 或 WSDL 生成 Java 代码。
- 插件配置: 在 jaxb2-maven-plugin 的配置中,指定 sourceType 为 wsdl,并配置 sources 指向 WSDL 文件所在的目录。 outputDirectory 指定生成 Java 代码的输出目录,packageName 指定生成代码的包名。
步骤总结
- 添加 JAXB 依赖: 在 pom.xml 文件中添加 jakarta.xml.bind-api 和 org.glassfish.jaxb:jaxb-runtime 依赖项。
- 添加 JAX-WS 依赖: 在 pom.xml 文件中添加 jakarta.xml.ws-api 和 com.sun.xml.ws:jaxws-rt 依赖项。
- 配置 jaxb2-maven-plugin: 使用 org.codehaus.mojo:jaxb2-maven-plugin 插件,并正确配置 WSDL 文件的位置、输出目录和包名。
- 构建项目: 运行 mvn clean install 命令来构建项目。 Maven 将会自动下载依赖项并从 WSDL 文件生成 Java 代码。
注意事项
- 版本兼容性: 确保 JAXB 和 JAX-WS 依赖项的版本与你的 Java 版本和 CXF 版本兼容。
- 插件选择: jaxb2-maven-plugin 比 cxf-codegen-plugin 更适合处理 JAXB 相关的代码生成。
- 清理输出目录: 如果遇到问题,可以尝试清理输出目录,确保旧的代码不会影响新的代码生成。
通过以上步骤,你应该能够成功解决 Maven CXF WSDL2Java 生成代码时遇到的 JAXB 相关错误,并顺利生成所需的 Java 代码。 记住,仔细检查你的 Maven 配置和依赖项,确保它们与你的项目环境兼容。










