解决Maven CXF WSDL2Java生成代码时 JAXB 相关错误

本文旨在帮助开发者解决在使用 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 的替代实现。以下提供一种可行的解决方案,通过调整 Ma

ven 配置和引入正确的依赖项来解决这个问题。

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
            
      
    
  

关键点说明:

  • 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 指定生成代码的包名。

步骤总结

  1. 添加 JAXB 依赖: 在 pom.xml 文件中添加 jakarta.xml.bind-api 和 org.glassfish.jaxb:jaxb-runtime 依赖项。
  2. 添加 JAX-WS 依赖: 在 pom.xml 文件中添加 jakarta.xml.ws-api 和 com.sun.xml.ws:jaxws-rt 依赖项。
  3. 配置 jaxb2-maven-plugin: 使用 org.codehaus.mojo:jaxb2-maven-plugin 插件,并正确配置 WSDL 文件的位置、输出目录和包名。
  4. 构建项目: 运行 mvn clean install 命令来构建项目。 Maven 将会自动下载依赖项并从 WSDL 文件生成 Java 代码。

注意事项

  • 版本兼容性: 确保 JAXB 和 JAX-WS 依赖项的版本与你的 Java 版本和 CXF 版本兼容。
  • 插件选择: jaxb2-maven-plugin 比 cxf-codegen-plugin 更适合处理 JAXB 相关的代码生成。
  • 清理输出目录: 如果遇到问题,可以尝试清理输出目录,确保旧的代码不会影响新的代码生成。

通过以上步骤,你应该能够成功解决 Maven CXF WSDL2Java 生成代码时遇到的 JAXB 相关错误,并顺利生成所需的 Java 代码。 记住,仔细检查你的 Maven 配置和依赖项,确保它们与你的项目环境兼容。