这次真的是学习了,遇到了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()
,方法所在的类路径一目了然吧?
从上面的Class查找结果看,在两个不同的maven库下存在同样的接口定义,分别是
Maven:org.codehaus.plexus
和Maven: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,进入依赖图。
image.png
然后Command+f搜索org.sonatype.sisu。定位到sisu-inject-plexus,回车。
image.png
右击选择exclude
image.png
可以看到,冲突的jar依赖被排除了。
image.png
此时再查找class,发现冲突的jar包真的不见了,再次Run起来也OK了。
image.png
参考资料
NoSuchMethodError 常见原因及解决方法
java--遇到NoSuchMethodError通用解决思路
NoSuchMethodError推荐
网友评论