前言
一个阳光明媚的上午,临近午饭,收到了一个邮件。
开始纠结吃还是不吃的问题,当然本着职业操守,那肯定是要先吃饭的,不过看着提示还是挺简单的,就直接给jar 包,maven 文件进行了修改升级,行云流水,一顿操作猛如虎,打包,上传,部署,一气呵成。开开心心吃饭去了。
启动报错
吃完饭回来发现这个项目没有启动成功,本身这个服务是测试环境的,之前也是有问题一直是瘫痪的状态,所以感受不是很直观。正好还有其他问题,就暂且放过了这个事儿。
结果组长来说,你这得启动成功啊,不成功不算是解决漏洞,还需要回复邮件,那就刚一波吧。说实话,公司这个项目使用tomcat 容器进行运行而不是直接使用spring boot 我真的是头疼。还有就是对tomcat 的使用已经是很遥远的记忆了,虽然spring boot 内部也是使用
项目情况
spring 4.2.2
dubbo 2.7.7
看下报错内容
28-Feb-202217:54:38.348SEVERE [startStop-1] org.apache.catalina.core.StandardContext.listenerStartExceptionsendingcontextinitializedeventtolistenerinstanceofclass [org.springframework.web.context.ContextLoaderListener] org.springframework.beans.factory.BeanCreationException: Errorcreatingbeanwithname'referenceAnnotationBeanPostProcessor': Instantiationofbeanfailed; nestedexceptionisorg.springframework.beans.BeanInstantiationException: Failedtoinstantiate [org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor]: Constructorthrewexception; nestedexceptionisjava.lang.NoSuchMethodError: org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.setClassValuesAsString(Z)Vatorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1105) atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1050) atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) atorg.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) atorg.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) atorg.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) atorg.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) atorg.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:207) atorg.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:683) atorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:522) atorg.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) atorg.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) atorg.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) atorg.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4699) atorg.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5165) atorg.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) atorg.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1412) atorg.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1402) atjava.util.concurrent.FutureTask.run(FutureTask.java:266) atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) atjava.lang.Thread.run(Thread.java:748) Causedby: org.springframework.beans.BeanInstantiationException: Failedtoinstantiate [org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor]: Constructorthrewexception; nestedexceptionisjava.lang.NoSuchMethodError: org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.setClassValuesAsString(Z)Vatorg.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163) atorg.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1098) ... 22moreCausedby: java.lang.NoSuchMethodError: org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.setClassValuesAsString(Z)Vatorg.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.<init>(ReferenceAnnotationBeanPostProcessor.java:106) atsun.reflect.NativeConstructorAccessorImpl.newInstance0(NativeMethod) atsun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) atsun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) atjava.lang.reflect.Constructor.newInstance(Constructor.java:423) atorg.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
贴个类似的问题及解决方案
https://github.com/alibaba/spring-cloud-alibaba/issues/2310
可以对照alibaba 给出的版本对应表进行构建项目
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
实践操作
通过maven 仓库检查dubbo-2.7.15的相关依赖
https://mvnrepository.com/artifact/org.apache.dubbo/dubbo/2.7.15
通过相同的方式看该jar 包还需要什么,进行对项目的引入。打包,构建,上传,部署,还是出现了上面的报错。准备继续在https://github.com/apache/dubbo/issues/9494
dubbo 的git hub 仓库里溜达溜达。
坚持不懈,大家加油!!!
最终解决
将项目打包发布到测试环境后,war包在tomcat 中会被自动解压,进入WEB-INF/lib 目录,看打包后的依赖jar 都有哪些,无意间发现有两个相同名字不同版本的jar包。
spring-context-support-1.0.11.jar
spring-context-support-1.0.6.jar
想着有两个相同名称的jar 包,可能是用错了版本,而且上面也说了,dubbo 2.7.15 需要的是1.0.11 版本jar。抱着试一试的心态,将多出来的1.0.6版本的jar 删除。
重新启动tomcat 一片祥和清净,项目启动。
感觉是jar 包冲突就在pom 文件里一通翻找,最终也没找到依赖1.0.6 版本的spring-context-support jar 是哪来的。也临近下班着急回家给家人送钥匙就先以解决问题为本吧。结果第二天早上一来,重新解压war 包想重现当初的情况,发现多余的jar 包没解压出来。
这我就懂了啊,因为测试环境的tomcat 没有自动解压war包而是手动解压的,我是通过unzip -o war-name.war 命令进行解压的,是没有覆盖掉1.0.6 版本的包的,所以它一直存在,虽然我改了pom 升级了该包。以后一定要把老的东西删干净,再解压新的war包。
好啦,一点一点的发现问题的本质,也算是我们搞程序人的素养了,虽然再过程中有怀疑过自己,可最终解决了问题就很哇塞了。
大家加油!!!