17370845950

解决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 的替代实现。以下提供一种可行的解决方案,通过调整 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
            
      
    
  

关键点说明:

  • 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 配置和依赖项,确保它们与你的项目环境兼容。