You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从JDK 8迁移至JDK 17时Apache CXF适配问题咨询

JDK 17 + Spring Boot 3.1 迁移时 Apache CXF 的调整方案

从JDK 8迁移到JDK 17并同步升级Spring Boot/Cloud到3.1版本时,Apache CXF确实需要做几处关键调整,以下是具体要点:

  • 升级CXF版本到适配分支
    Spring Boot 3.1基于Jakarta EE 9,要求CXF使用4.x系列版本(旧的3.x版本仅适配Java EE和JDK8)。你需要把cxf-codegen-plugin以及项目中所有CXF核心依赖(如cxf-spring-boot-starter-jaxws、cxf-rt-frontend-jaxws等)的版本统一升级到4.0.0及以上,示例配置:

    <plugin>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-codegen-plugin</artifactId>
        <version>4.0.2</version>
        <!-- 其余原有配置保持不变 -->
    </plugin>
    
  • 补充JDK17移除的JAXB依赖
    JDK 9之后官方移除了JAXB模块,而CXF生成的SOAP客户端依赖JAXB处理XML。在Spring Boot3环境下,需要添加Jakarta版本的JAXB依赖到pom.xml:

    <dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <scope>runtime</scope>
    </dependency>
    
  • 适配JDK17的模块系统与反射权限
    JDK17的模块系统对反射访问做了严格限制,CXF内部及生成的代码可能需要访问JDK内部类。可以在应用启动参数中添加以下配置:

    --add-opens java.base/java.lang=ALL-UNNAMED
    --add-opens java.base/java.util=ALL-UNNAMED
    --add-modules java.se
    

    如果是Spring Boot应用,也可在application.properties中添加:

    spring.main.allow-bean-definition-overriding=true
    
  • 调整加密与TLS配置
    JDK17默认禁用了TLS 1.0、TLS 1.1等旧协议以及部分弱加密算法,如果SOAP服务端仍使用这些配置,会导致握手失败。解决方式:

    1. 优先升级服务端到TLS 1.2或更高版本;
    2. 若无法升级服务端,可修改JDK的java.security文件,移除jdk.tls.disabledAlgorithms中对应的协议/算法,或在应用启动时添加参数:
      -Djdk.tls.disabledAlgorithms="SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224"
      

    同时,CXF的SSLContext配置需适配JDK17的API,避免使用已废弃的加密相关类。

  • 适配Jakarta EE命名空间
    Spring Boot3全面切换到Jakarta EE API,CXF生成的代码需要从javax.*包切换到jakarta.*包。可通过添加JAXB绑定文件实现:
    在src/main/resources下创建jaxb-binding.xml:

    <jaxb:bindings xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb" version="3.0">
        <jaxb:globalBindings>
            <jaxb:serializable uid="1"/>
        </jaxb:globalBindings>
    </jaxb:bindings>
    

    然后在cxf-codegen-plugin的wsdlOption中添加绑定配置:

    <wsdlOption>
        <wsdl>/src/main/resources/wsdl/Test.wsdl</wsdl>
        <wsdlLocation>classpath:wsdl/Test.wsdl</wsdlLocation>
        <bindings>
            <binding>src/main/resources/jaxb-binding.xml</binding>
        </bindings>
    </wsdlOption>
    

内容的提问来源于stack exchange,提问作者LearnAndHelpLearn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:35:03