在一次項目遷移的過程中,新導入了兩個依賴,結果項目啟動就報錯,如下:
主要原因是:Failed to start bean 'eurekaAutoServiceRegistration'; nested exception is java.lang.NullPointerException,我的理解是初始化失敗了,這種涉及到框架的錯誤一出現,一開始確實沒有頭緒,也參考了網上的資料,主要如下:
- 有把原因歸咎於引入了fastjson導致的,項目中確實是引入了fastjson,但是將其依賴去除之后依然報錯,所以這個方法對我無效;
- 也有說是未引入Jackson或者版本不對,但是這很模糊,是什么版本不對?並沒有說清楚;
其實這里問題的出現是由於我新引入的了兩個依賴導致的,這是排查問題的源頭,我們排查問題時不能沒有思路,要順藤摸瓜,追根溯源,一步一步來定位問題。我引入的依賴如下:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.2.1</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.2.1</version> </dependency>
這是兩個httpcompoents包,是由於項目中需要發起https請求引入的,怎么引入這個依賴就會導致沖突呢?
maven依賴規則里面有兩條分別是:
- 聲明優先原則,在pom.xml配置文件中,如果有兩個名稱相同版本不同的依賴聲明,那么先寫的會生效。 所以,先聲明自己要用的版本的jar包即可;
- 路徑近者優先,直接依賴優先於傳遞依賴,如果傳遞依賴的jar包版本沖突了,那么可以自己聲明一個指定版本的依賴jar,即可解決沖突;
其中從第二條,我的理解是以路徑最近的為准,這里路徑最近的就是我新引入的這兩個依賴,那是否是eureka也有依賴httpcomponents,但是根據路徑近者優先原則,eureka啟動時主動依賴新的這兩個包,但是這兩個包版本可能和eureka不兼容,從而啟動失敗?好,那就來驗證一下:
看項目依賴我平時常用的是直接把項目的依賴樹打出來,直接看,這樣比較全面。Windows 10 系統下進入cmd命令窗口,在項目根目錄下輸入如下指令(電腦上需安裝了maven):
mvn dependency:tree
打印出來的依賴樹如下(截取了部分):
看到了嗎,eureka確實引入了httpcomponents兩個包,而且版本號高於我自己引入的,應該是版本號不兼容導致啟動報錯,所以我把自己引入的兩個包版本號改了一下,結果確實成功啟動了。
到這里問題已經解決了,特此記錄一下
參考文獻:
Failed to start bean 'eurekaAutoServiceRegistration'
Can't use @EnableEurekaClient to register config server with Eureka