Mac Idea 解决NoSuchMethodError

这次真的是学习了,遇到了NoSuchMethodError的错误。记录一下解决的过程。

.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [/sqs] threw exception [Filter execution threw an exception] with root cause
java.lang.NoSuchMethodError: org.codehaus.plexus.ContainerConfiguration.getLifecycleHandlerManager()Lorg/codehaus/plexus/lifecycle/LifecycleHandlerManager;
 at org.unidal.lookup.ContainerLoader.preConstruction(ContainerLoader.java:145)
 at org.unidal.lookup.ContainerLoader.getDefaultContainer(ContainerLoader.java:104)
 at org.unidal.lookup.ContainerLoader.getDefaultContainer(ContainerLoader.java:89)
1. 首先定位到没有找到的方法所在的类jar包路径

Mac的快捷键是Command+o,也可以到导航栏Navigate->Class点击弹出,如下,将org.codehaus.plexus.ContainerConfiguration输入。这个类路径是如何确定的呢?从上面的异常信息看,没有找到的方法是java.lang.NoSuchMethodError: org.codehaus.plexus.ContainerConfiguration.getLifecycleHandlerManager(),方法所在的类路径一目了然吧?

Mac Idea 解决NoSuchMethodError_第1张图片
image.png

从上面的Class查找结果看,在两个不同的maven库下存在同样的接口定义,分别是 Maven:org.codehaus.plexusMaven:org.sonatype.sisu。如果分别进入两个class查看的话,可以看到在org.codehaus.plexus中是存在getLifecycleHandlerManager方法,而org.sonatype.sisu不存在getLifecycleHandlerManager方法定义的,所以,是程序运行期间加载了org.sonatype.sisu,所以报了NoSuchMethodError的异常。

2、排除对应冲突的jar包

既然确定了是因为jvm选择加载了org.sonatype.sisu而不是org.codehaus.plexus,我们的解决方案的目的就很明确了,就是排除org.sonatype.sisu包。在eclise里排除很简单,但是idea貌似不太容易,当然,最后还是找到了解决办法。
如下图,分部点击对应的123,进入依赖图。


Mac Idea 解决NoSuchMethodError_第2张图片
image.png

然后Command+f搜索org.sonatype.sisu。定位到sisu-inject-plexus,回车。


Mac Idea 解决NoSuchMethodError_第3张图片
image.png

右击选择exclude
Mac Idea 解决NoSuchMethodError_第4张图片
image.png

可以看到,冲突的jar依赖被排除了。
Mac Idea 解决NoSuchMethodError_第5张图片
image.png

此时再查找class,发现冲突的jar包真的不见了,再次Run起来也OK了。


Mac Idea 解决NoSuchMethodError_第6张图片
image.png
参考资料

NoSuchMethodError 常见原因及解决方法
java--遇到NoSuchMethodError通用解决思路
NoSuchMethodError推荐

你可能感兴趣的:(Mac Idea 解决NoSuchMethodError)