Maven项目运行报NoSuchMethodError如何定位冲突依赖库
Eclipse启动Maven项目报NoSuchMethodError定位方案
问题复现
在Eclipse中通过Run As / Java Application启动Maven项目时抛出如下错误:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.io.output.DeferredFileOutputStream.<init>(ILjava/lang/String;Ljava/lang/String;Ljava/io/File;)V at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.writeRequestBodyToOutputStream(ApacheHttpClient4Engine.java:556) at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.buildEntity(ApacheHttpClient4Engine.java:524) at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.loadHttpMethod(ApacheHttpClient4Engine.java:423) at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:281) at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:436) at org.jboss.resteasy.client.jaxrs.internal.ClientInvocationBuilder.post(ClientInvocationBuilder.java:195) at com.allianzWebServices.ws.SubmitDocumentVersionClient.main(SubmitDocumentVersionClient.java:56)
初步判断为依赖冲突:org.apache.commons.io.output.DeferredFileOutputStream的构造方法参数数量和调用方预期不匹配,但调用来源类org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine既未在pom.xml声明,也未出现在Maven传递依赖列表、Eclipse Dependency Hierarchy视图中,常规依赖排查手段无法定位根因。
当前项目pom依赖配置、mvn dependency:tree输出均未包含resteasy相关组件。
根因定位步骤
查不到resteasy类的核心原因是:Eclipse启动Java程序时的实际类路径,和Maven解析出来的依赖树不是完全一致的,mvn dependency:tree只能识别pom中声明的Maven依赖,不会包含Eclipse额外加入类路径的内容。按以下步骤排查可以100%定位根因:
- 直接打印类的实际加载路径
在main方法最开头加入两行代码,启动后控制台会直接输出冲突类来自哪个jar包,不需要靠猜:
常见的非Maven引入路径包括:Eclipse中配置的JBoss/WildFly等服务器Runtime库、手动添加到Java Build Path的外部jar、工作空间内其他关联项目的依赖、Eclipse插件自动注入的依赖。public static void main(String[] args) { // 打印两个冲突类的实际加载jar路径 System.out.println("DeferredFileOutputStream来源: " + org.apache.commons.io.output.DeferredFileOutputStream.class.getProtectionDomain().getCodeSource().getLocation()); System.out.println("ApacheHttpClient4Engine来源: " + org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.class.getProtectionDomain().getCodeSource().getLocation()); // 原有业务代码 } - 核对启动配置的类路径
打开Eclipse的Run Configurations面板,找到当前main类对应的启动项,切换到Classpath标签页,展开所有条目搜索resteasy和commons-io,可以直接看到哪个条目把不在pom里的jar加进了运行时类路径。 - 核对项目构建路径
右键项目打开Properties -> Java Build Path -> Libraries,检查除了Maven Dependencies、JRE System Library之外的条目:如果有手动添加的外部jar、服务器Runtime、其他项目依赖,非必要的全部移除,所有依赖统一交给Maven管理。
修复方案
- 首先升级pom中显式声明的commons-io版本:当前用的2.1版本本身就不带报错的四参数构造方法(该方法从commons-io 2.2版本开始提供),直接升级到2.6及以上稳定版即可匹配高版本httpclient、resteasy的调用要求。
- 移除类路径中所有非Maven管理的多余resteasy相关依赖;如果业务确实需要用到resteasy,直接在pom中显式声明匹配的resteasy版本,避免传递依赖引入版本不兼容的组件。
- 修改完成后右键项目执行
Maven -> Update Project,勾选Force Update of Snapshots/Releases强制更新依赖后再启动验证。
内容的提问来源于stack exchange,提问作者Theodore K.
相关产品推荐
相关产品推荐

