Spring Boot项目在IntelliJ正常运行,gradle bootRun报NoSuchMethodError
Spring Boot项目IDEA运行正常但gradle bootRun抛NoSuchMethodError异常
我的Spring Boot项目在IntelliJ IDEA中运行完全正常,但使用gradle bootRun命令运行时,编译通过但执行阶段抛出NoSuchMethodError异常。
build.gradle内容
plugins { id 'org.springframework.boot' version '2.6.3' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = "16" configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'com.github.salesforce-marketingcloud:fuelsdk:1.6.0' implementation 'org.springframework.boot:spring-boot-starter-web:2.7.2' compileOnly 'org.projectlombok:lombok:1.18.24' developmentOnly 'org.springframework.boot:spring-boot-devtools:2.7.2' annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor:2.7.2' annotationProcessor 'org.projectlombok:lombok:1.18.24' testImplementation 'org.springframework.boot:spring-boot-starter-test:2.7.2' } tasks.named('test') { useJUnitPlatform() } targetCompatibility = JavaVersion.VERSION_16
错误堆栈信息
java.lang.NoSuchMethodError: 'org.codehaus.stax2.ri.EmptyIterator org.codehaus.stax2.ri.EmptyIterator.getInstance()' at com.ctc.wstx.sw.OutputElementBase.getPrefixes(OutputElementBase.java:358) ~[woodstox-core-asl-4.4.1.jar:4.4.1] at org.apache.cxf.staxutils.StaxUtils.writeStartElement(StaxUtils.java:789) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:737) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:701) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:625) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.interceptor.AbstractLoggingInterceptor.writePayload(AbstractLoggingInterceptor.java:168) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.interceptor.LoggingOutInterceptor$LoggingCallback.onClose(LoggingOutInterceptor.java:249) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:209) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:652) ~[cxf-rt-transports-http-3.1.2.jar:3.1.2] at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:324) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:277) ~[cxf-core-3.1.2.jar:3.1.2] at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96) ~[cxf-rt-frontend-simple-3.1.2.jar:3.1.2] at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:139) ~[cxf-rt-frontend-jaxws-3.1.2.jar:3.1.2] at jdk.proxy3/jdk.proxy3.$Proxy88.retrieve(Unknown Source) ~[na:na] at com.exacttarget.fuelsdk.ETSoapObject.retrieve(ETSoapObject.java:350) ~[fuelsdk-1.6.0.jar:na] at com.exacttarget.fuelsdk.ETSoapObject.retrieve(ETSoapObject.java:173) ~[fuelsdk-1.6.0.jar:na] at com.exacttarget.fuelsdk.ETSoapObject.retrieve(ETSoapObject.java:149) ~[fuelsdk-1.6.0.jar:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at com.exacttarget.fuelsdk.ETClient.retrieve(ETClient.java:630) ~[fuelsdk-1.6.0.jar:na] at com.exacttarget.fuelsdk.ETClient.retrieve(ETClient.java:569) ~[fuelsdk-1.6.0.jar:na] at com.example.sfmcbackend.service.DERetrievalService.getDataExtensionByName(DERetrievalService.java:18) ~[main/:na]
我已检查编译和运行时的classpath,所有依赖项(包括引发错误的依赖)均已存在。
解决方案
这个问题是依赖版本冲突导致的:woodstox-core-asl:4.4.1需要匹配特定版本的stax2-api,但项目中可能被Spring Boot的依赖管理引入了不兼容的版本,导致EmptyIterator.getInstance()方法找不到。
步骤1:确认依赖冲突
执行以下命令查看项目依赖树,找到stax2-api的版本:
gradle dependencies
你会发现可能存在多个版本的stax2-api,比如Spring Boot可能引入了更高版本,和woodstox-core-asl:4.4.1不兼容。
步骤2:强制指定兼容版本
woodstox-core-asl:4.4.1对应的兼容stax2-api版本是3.1.4,在build.gradle中添加以下依赖来强制指定:
dependencies { // 其他依赖... implementation 'org.codehaus.woodstox:stax2-api:3.1.4' }
或者通过依赖管理块统一控制版本:
dependencyManagement { dependencies { dependency 'org.codehaus.woodstox:stax2-api:3.1.4' } }
步骤3:验证修复
重新执行gradle bootRun,确认异常是否消失。如果还有问题,可以检查是否有其他依赖引入了冲突的woodstox版本,通过exclude排除:
比如如果spring-boot-starter-web引入了jackson的xml依赖带来冲突,可以排除:
implementation('org.springframework.boot:spring-boot-starter-web:2.7.2') { exclude group: 'com.fasterxml.jackson.dataformat', module: 'jackson-dataformat-xml' }
内容的提问来源于stack exchange,提问作者Wind Wolf
相关产品推荐
相关产品推荐

