Java17 Spring Boot项目突发jakarta/xml/bind/JAXBException错误排查求助
问题描述
基于Java 17的Spring Boot项目需调用SOAP API,依赖JAX-B实现相关功能。此前项目运行完全正常,但5天前在未修改任何代码的情况下,执行wsdl2javaTask任务时突然抛出java.lang.NoClassDefFoundError: jakarta/xml/bind/JAXBException错误。
完整错误栈
java.lang.NoClassDefFoundError: jakarta/xml/bind/JAXBException at com.sun.tools.ws.wscompile.WsimportTool.<init>(WsimportTool.java:103) at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:119) at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:105) at org.springframework.boot.gradle.tasks.ws.Wsdl2JavaTask.execWsImport(Wsdl2JavaTask.java:193) at org.springframework.boot.gradle.tasks.ws.Wsdl2JavaTask.execute(Wsdl2JavaTask.java:179) Caused by: java.lang.ClassNotFoundException: jakarta.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:520) ... 5 more
项目build.gradle配置片段
plugins { id 'org.springframework.boot' version '3.1.0' id 'io.spring.dependency-management' version '1.1.0' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web-services' } tasks.named('wsdl2java') { wsdlDir = file("src/main/resources/wsdl") generatedSourcesDir = file("build/generated-sources/wsdl2java") }
排查分析与解决方案
1. 显式引入JAX-B依赖
Java 17已移除JAX-B相关模块,必须手动引入。若项目未锁定依赖版本,仓库中依赖的更新可能导致编译时缺失jakarta.xml.bind.JAXBException类。在dependencies块中添加:
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.1' runtimeOnly 'com.sun.xml.bind:jaxb-impl:4.0.1' implementation 'jakarta.activation:jakarta.activation-api:2.1.2' // 部分场景需额外引入
2. 适配wsdl2java插件与Spring Boot版本
Spring Boot提供的wsdl2java任务依赖jaxws-tools,版本不兼容会引发类加载异常。显式指定工具版本:
dependencies { wsdl2java 'com.sun.xml.ws:jaxws-tools:4.0.1' }
3. 清理本地仓库缓存
本地仓库的依赖可能因网络或缓存损坏无法加载,执行以下命令重置依赖:
./gradlew clean build --refresh-dependencies
同时删除本地仓库中jakarta/xml/bind相关目录,重新下载依赖。
4. 验证JDK环境配置
确认项目使用的JDK版本为17,执行命令检查:
./gradlew -version
确保输出中的JDK版本与配置一致,且JAVA_HOME指向正确的Java 17安装目录。
内容的提问来源于stack exchange,提问作者Aram
相关产品推荐
相关产品推荐

