java.lang.NoSuchMethodError: org.springframework.aop.framework.AopProxyUtils.getSingletonTarget探索之路

前言

        今天在对之前已有的工程进行结构调整复用到其它项目的时候遇到了这个令人头疼的异常,很明确是依赖的JAR版本不对或JAR冲突问题,但就是不知道具体点在哪里,以至于用了很久的时间去处理解决。

        顺便碎言几句,这个问题应该是我第二次遇到,第一次的时候惭愧地认了怂继续复用了原框架,这次遇到还是要从头再来,上次半途而非的时间就彻底是浪费了。

遇到的朋友跟我看一下解决过程:

一、异常详情

四月 04, 2018 12:07:23 下午 org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class mocha.framework.web.context.ContextLoaderListener
java.lang.NoSuchMethodError: org.springframework.aop.framework.AopProxyUtils.getSingletonTarget(Ljava/lang/Object;)Ljava/lang/Object;
    at org.springframework.context.event.AbstractApplicationEventMulticaster.addApplicationListener(AbstractApplicationEventMulticaster.java:105)
    at org.springframework.context.support.AbstractApplicationContext.registerListeners(AbstractApplicationContext.java:810)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:540)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at mocha.framework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:16)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:724)

二、项目框架环境(我觉得这个很有必要提一下,下面仅列出了关注的部分)

1、框架技术 :  Maven、SpringMVC + Spring + Mybatis     

2、数据库连接池:dbcp

3、框架版本:Spring 3.2.13.RELEASE

4、连接池版本:common-dbcp-1.2.2


三、处理过程简述

        bing一下,感觉跟度娘结果差不多(英语正在恶补,所以google的暂时看着还有点头大),前辈们给出了两个方向:升级spring版本  和  根据maven依赖树分析jar情况。

        个人不建议采用‘升级Spring版本’这个方案,第一次的时候已经做过尝试,发现升级了Spring版本后虽然这个异常不再抛出,但却出现了更多连带的问题,如果时间不充裕的话反而会感觉费力不讨好。

          日志看不出个鬼,只能站在前辈的肩膀上看maven依赖树(eclipse环境下打开pom.xml文件下面第三个页签),从上往下依次看冲突(conflict)的jar,如果conflict版本不一致则需要注意。我看了一下,有两个版本不一致的冲突:commons-dbcp下依赖了1.3版本的commons-pool.jar 和 另外一个(忘记记录了,改了之后不是它影响,就不提了)。

此时尝试着禁用掉dbcp关联引入的commons-pool.jar(使用<exclusions>标签),自主引入高版本的commons-pool.jar,我引入了1.6版本。

        哦,此处提一句,pom.xml文件里面使用不到的配置就删掉,不要留在pom.xml里面。比如定义的properties内容。

        此时,问题应该是解决了,但我这里还没有好,就出现了某位前辈讲到的 “添加创建事务管理的配置就抛错、不添加该配置就能正常启动”的现象。再看老半天也没思路,就开了DEBUG日志,原本想看看是不是有更加详细的异常。

        在DEBUG模式下,我发现一行WARN的红色提示,竟然说eclipse/xxxxx/wt/xxx(项目的发布目录)存在一个我删掉了的JAR文件,好吧,copy了路径去文件夹里面看看,的确是有并且我发现里面文件的编辑时间竟然是3个小时前,好吧我不知道eclipse的clean 和 publish的功效具体是怎样的,老夫子clean、publish、maven update那么多次,它竟然是这样的eclipse.

        把eclipse关掉,在文件夹里把发布的文件删除干净(不是生气关掉,吃饭的家伙再恼也不能扔是不,是应为不关掉文件夹不让你删),重启eclipse ->clean ->publish。再启动,就这样成功了!


四、经验教训

 1、问题再静心多看一眼,也许就是答案,半路放弃注定是日后要还的;

 2、DEBUG真的很有用,建议初学者不要放过你们的导师,让他们带你玩DEBUG;


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值