項目是一個基于maven的web項目,依賴于公司的核心包。問題是在eclipse下部署成功,但在idea下部署失敗。報錯如下:
2017-11-16 17:08:28 hrp_mp_scheduler [org.springframework.web.context.ContextLoader.initWebApplicationContext:353] - [ERROR] Context initialization failed
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [classpath*:config/kyee-include-all.xml]
Offending resource: class path resource [applicationContext.xml]; nested exception is org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [classpath:config/core/scheduler.xml]
Offending resource: URL [jar:file:/Users/huangpeng/workspace/tomcat/apache-tomcat-8.0.43/webapps/hrp_mp_scheduler/WEB-INF/lib/kyee_nextframework_core-1.0.70.jar!/config/kyee-include-all.xml]; nested exception is org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Only one AsyncAnnotationBeanPostProcessor may exist within the context.
Offending resource: class path resource [config/core/scheduler.xml]
調查發現把項目部署在eclipse中時,lib目錄下的jar包是正常的;部署到idea中以后,tomcat目錄下webapps,進入到項目目錄中,發現lib目錄下有兩個核心包,一個老版本,一個新版本。
于是到idea中查看了target目錄下,是有兩個核心包的,核心包被加載了兩次,當然沖突了。下圖是target目錄:
image.png
所以就手動刪除了老版本的核心包,重啟以后項目就跑起來了。
image.png
沖突的jar包會顯示成這樣,一個是灰色的表示正常,另一個是黑色的應該的沒什么用,但是卻被錯誤的引入了進來,導致了項目無法啟動,所以要將黑色的包刪掉。
后記:
剛開始看日志報錯一直以為是配置錯誤,還在jar包里看配置文件看是否哪里重復了,最后還是耐心看日志,發現在報錯前已經加載了一遍配置文件,而且日志上寫的很清楚,第一次加載的是老版本核心包的配置文件,然后加載新版本的配置文件就報錯了。
所以排查問題時不能只看報錯的那一行,要聯系上下文,前后都得看一看。