Java21+SpringBoot3升级用cxf-codegen生成WSDL类遇JAXBException
问题:Java21 + SpringBoot3.x 下使用cxf-codegen插件生成WSDL代码失败
- 升级项目到Java21和SpringBoot3.x,使用
io.mateo.cxf-codegen插件生成WSDL对应的Java类 - 执行自定义
generateJavaFromWsdl任务时出现两个问题:- com.sun.xml.bind相关依赖的pom中,
com.sun:tools:jar的systemPath为${tools.jar},未指定绝对路径 - 抛出
java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException,任务执行失败
- com.sun.xml.bind相关依赖的pom中,
- 尝试添加
com.sun.xml.bind:jaxb-xjc、jaxb-core、jaxb-impl等依赖,问题未解决
原Gradle配置
import io.mateo.cxf.codegen.wsdl2java.Wsdl2Java buildscript { dependencies { classpath 'javax.xml.ws:jaxws-api:2.3.1' classpath 'javax.jws:javax.jws-api:1.1' } } plugins { id 'idea' id 'java' id 'jacoco' id 'org.springframework.boot' version '2.7.18' id 'io.spring.dependency-management' version '1.1.3' id 'io.mateo.cxf-codegen' version '2.3.0' } apply plugin: 'java' ext { springBootVersion = '2.7.18' springSecurityVersion = '5.7.8' mapstructVersion = '1.4.2.Final' lombokVersion = '1.18.24' } repositories { mavenLocal() } configurations.all { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' } dependencies { // fixes fuer twistlock-findings implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2' implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.13.4' implementation(group: 'org.springframework.boot', name: 'spring-boot-starter-web') { exclude(module: 'spring-boot-starter-tomcat') } implementation("org.springframework.boot:spring-boot-starter-web-services:${springBootVersion}") { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' } implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation', version: springBootVersion implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: springBootVersion implementation group: 'org.springframework.boot', name: 'spring-boot-starter-jetty', version: springBootVersion implementation group: 'org.springframework', name: 'spring-core', version: '5.3.32' implementation group: 'org.springframework', name: 'spring-web', version: '5.3.32' implementation group: 'org.apache.cxf', name: 'cxf-codegen-plugin', version: '4.0.3' implementation group: 'org.jvnet.jaxb', name: 'jaxb-maven-plugin', version: '4.0.0' // spring-security implementation("org.springframework.boot:spring-boot-starter-security:${springBootVersion}") { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' } implementation("org.springframework.security:spring-security-oauth2-jose:${springSecurityVersion}") implementation("org.springframework.security:spring-security-oauth2-resource-server:${springSecurityVersion}") // spring-data implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: springBootVersion implementation group: 'org.postgresql', name: 'postgresql', version: '42.7.2' implementation("org.apache.logging.log4j:log4j-api:2.13.3") implementation group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '7.2' implementation 'org.apache.commons:commons-lang3:3.12.0' implementation group: 'org.apache.commons', name: 'commons-collections4', version: '4.4' implementation 'javax.servlet:javax.servlet-api:3.1.0' implementation 'javax.transaction:javax.transaction-api:1.3' // lombok compileOnly "org.projectlombok:lombok:${lombokVersion}" annotationProcessor "org.projectlombok:lombok:${lombokVersion}" // mapstruct gradle >= 3.4 configuration implementation "org.mapstruct:mapstruct:${mapstructVersion}" annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}" implementation 'jakarta.xml.ws:jakarta.xml.ws-api:3.0.0' implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0' implementation 'jakarta.jws:jakarta.jws-api:3.0.0' implementation 'org.springdoc:springdoc-openapi-ui:1.6.11' implementation 'javax.xml.ws:jaxws-api:2.3.1' implementation 'javax.jws:javax.jws-api:1.1' } cxfCodegen { cxfVersion = "3.2.0" } tasks.register("generateJavaFromWsdl", Wsdl2Java){ toolOptions{ wsdl.set(file("$projectDir/src/wsdl/1_1.wsdl").toPath().toAbsolutePath().toString()) } } sourceCompatibility = '21'
错误日志
Errors occurred while building effective model from C:\Users\user.gradle\caches\modules-2\files-2.1\com.sun.xml.bind\jaxb-xjc\2.2.11\4da3d39ae8ccc39549e3f8971f56035f61d7bf79\jaxb-xjc-2.2.11.pom: 'dependencyManagement.dependencies.dependency.systemPath' for com.sun:tools:jar must specify an absolute path but is ${tools.jar} in com.sun.xml.bind:jaxb-xjc:2.2.11 Errors occurred while building effective model from C:\Users\user.gradle\caches\modules-2\files-2.1\com.sun.xml.bind\jaxb-core\2.2.11\db0f76866c6b1e50084e03ee8cf9ce6b19becdb3\jaxb-core-2.2.11.pom: 'dependencyManagement.dependencies.dependency.systemPath' for com.sun:tools:jar must specify an absolute path but is ${tools.jar} in com.sun.xml.bind:jaxb-core:2.2.11 Errors occurred while building effective model from C:\Users\user.gradle\caches\modules-2\files-2.1\com.sun.xml.bind\jaxb-impl\2.2.11\2d4b554997fd01d1a2233b1529b22fc9ecc0cf5c\jaxb-impl-2.2.11.pom: 'dependencyManagement.dependencies.dependency.systemPath' for com.sun:tools:jar must specify an absolute path but is ${tools.jar} in com.sun.xml.bind:jaxb-impl:2.2.11 Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException at org.apache.cxf.tools.wsdlto.WSDLToJava.(WSDLToJava.java:48) at org.apache.cxf.tools.wsdlto.WSDLToJava.main(WSDLToJava.java:182) Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ... 2 more Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException Execution failed for task ':generateJavaFromWsdl'. Process 'command 'C:\Users\user\jdk-21.0.2\bin\java.exe'' finished with non-zero exit value 1
解决方案
核心问题分析
- JAXB依赖冲突:Java9+移除了JDK自带的JAXB,SpringBoot3.x使用Jakarta EE API(
jakarta.xml.bind)而非旧Java EE API(javax.xml.bind),但原配置的CXF 3.2.0基于旧API,导致依赖不兼容。 - tools.jar无效依赖:旧版本JAXB依赖(如2.2.11)依赖已废弃的
tools.jar,Java21中不存在该文件,引发路径警告。
具体修复步骤
- 升级CXF到支持Jakarta EE的4.x版本
- 统一所有依赖为Jakarta API,移除旧的
javax.*依赖 - 为cxf-codegen任务指定适配Java21的JAXB工具依赖
- 排除无效的
tools.jar依赖
修改后的Gradle配置
import io.mateo.cxf.codegen.wsdl2java.Wsdl2Java plugins { id 'idea' id 'java' id 'jacoco' id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' id 'io.mateo.cxf-codegen' version '2.3.0' } ext { springSecurityVersion = '6.2.0' mapstructVersion = '1.5.5.Final' lombokVersion = '1.18.30' } repositories { mavenLocal() mavenCentral() } configurations.all { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' exclude group: 'com.sun', module: 'tools' } dependencies { // fixes fuer twistlock-findings implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.3' implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.15.3' implementation(group: 'org.springframework.boot', name: 'spring-boot-starter-web') { exclude(module: 'spring-boot-starter-tomcat') } implementation 'org.springframework.boot:spring-boot-starter-web-services' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-jetty' // spring-security implementation 'org.springframework.boot:spring-boot-starter-security' implementation "org.springframework.security:spring-security-oauth2-jose:${springSecurityVersion}" implementation "org.springframework.security:spring-security-oauth2-resource-server:${springSecurityVersion}" // spring-data implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.postgresql:postgresql:42.7.2' implementation 'org.apache.logging.log4j:log4j-api:2.20.0' implementation 'net.logstash.logback:logstash-logback-encoder:7.4' implementation 'org.apache.commons:commons-lang3:3.14.0' implementation 'org.apache.commons:commons-collections4:4.4' implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' implementation 'jakarta.transaction:jakarta.transaction-api:2.0.1' // lombok compileOnly "org.projectlombok:lombok:${lombokVersion}" annotationProcessor "org.projectlombok:lombok:${lombokVersion}" // mapstruct implementation "org.mapstruct:mapstruct:${mapstructVersion}" annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}" // Jakarta EE API implementation 'jakarta.xml.ws:jakarta.xml.ws-api:4.0.1' implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.1' implementation 'jakarta.jws:jakarta.jws-api:3.0.0' implementation 'org.springdoc:springdoc-openapi-ui:2.2.0' } cxfCodegen { cxfVersion = "4.0.3" wsdl2Java { toolClasspath configurations.create('cxfCodegenTool') { dependencies { implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.4' implementation 'org.glassfish.jaxb:jaxb-xjc:4.0.4' implementation 'org.apache.cxf:cxf-tools-wsdlto-core:4.0.3' implementation 'org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:4.0.3' } } } } tasks.register("generateJavaFromWsdl", Wsdl2Java){ toolOptions{ wsdl.set(file("$projectDir/src/wsdl/1_1.wsdl").toPath().toAbsolutePath().toString()) args.add("-xjc") args.add("-xmlschema") args.add("-p") args.add("your.package.name") // 替换为实际包名 } } sourceCompatibility = '21' targetCompatibility = '21'
关键修改说明
- 升级SpringBoot到3.x:自动适配Java21和Jakarta EE生态
- 统一Jakarta API:替换所有
javax.*依赖为jakarta.*版本,消除API冲突 - 升级CXF到4.0.3:支持Jakarta EE,解决JAXB兼容问题
- 指定JAXB工具依赖:使用GlassFish的Jakarta版本JAXB工具,避免拉取旧版com.sun.xml.bind依赖
- 排除tools.jar:消除无效路径警告
- 升级第三方库:适配SpringBoot3和Java21的版本要求
内容的提问来源于stack exchange,提问作者Roma Kap
相关产品推荐
相关产品推荐

