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

Java21+SpringBoot3升级用cxf-codegen生成WSDL类遇JAXBException

问题:Java21 + SpringBoot3.x 下使用cxf-codegen插件生成WSDL代码失败
  • 升级项目到Java21和SpringBoot3.x,使用io.mateo.cxf-codegen插件生成WSDL对应的Java类
  • 执行自定义generateJavaFromWsdl任务时出现两个问题:
    1. com.sun.xml.bind相关依赖的pom中,com.sun:tools:jar的systemPath为${tools.jar},未指定绝对路径
    2. 抛出java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException,任务执行失败
  • 尝试添加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

解决方案

核心问题分析

  1. JAXB依赖冲突:Java9+移除了JDK自带的JAXB,SpringBoot3.x使用Jakarta EE API(jakarta.xml.bind)而非旧Java EE API(javax.xml.bind),但原配置的CXF 3.2.0基于旧API,导致依赖不兼容。
  2. 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'

关键修改说明

  1. 升级SpringBoot到3.x:自动适配Java21和Jakarta EE生态
  2. 统一Jakarta API:替换所有javax.*依赖为jakarta.*版本,消除API冲突
  3. 升级CXF到4.0.3:支持Jakarta EE,解决JAXB兼容问题
  4. 指定JAXB工具依赖:使用GlassFish的Jakarta版本JAXB工具,避免拉取旧版com.sun.xml.bind依赖
  5. 排除tools.jar:消除无效路径警告
  6. 升级第三方库:适配SpringBoot3和Java21的版本要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:35:54