从JDK 8迁移至JDK 17时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服务端仍使用这些配置,会导致握手失败。解决方式:- 优先升级服务端到TLS 1.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

