首先,說明一下我的錯誤原因:是因爲provider端打jar包方式的錯誤導致的,如果你已經將這種錯誤可能排除了,就不用浪費時間看我囉嗦了。maven基礎比較弱,之後系統學一下吧,見諒。
解決方案:
我在出錯的時候,在網上查找發現很多人寫的博文大多都是上來一頓描述自己的排查歷程,然後說到最後讀者發現問題和自己的不一樣。浪費了很多時間,所以我先將問題和解決方案提出來了。
我是直接將provider端的api 使用maven install打包了一下。然後在consumer端直接引入jar包。然後就導致了一系列的問題,最主要的也就是classNotFound的問題,provider端的接口沒有注入到spring容器中。在網上查了很長時間,發現是provider端的jar打包打的有問題。原本是隻maven install了api,正常是需要將整個項目都maven install了。就是在provider的parent(root) install一下就行了,然後在引用api中的jar就ok。
問題排查過程:
首先,引入provider端的jar包後,發現接口沒有注入成功,啓動服務報錯classNotFound。
沒有注入成功,首先排查provider端提供服務是否正常。排查方式有:
(1)zookeeper+getBean的方式加載配置文件直接調用provider端的接口
(2)點對點方式+getBean搞一下。
以上兩個方法我都測試成功了,那麼問題一定是出在了注入這裏。檢查spring掃描包是否將dubbo的配置文件給掃描上了
這些在我項目中都沒有問題,那麼就來排查一下提供方給的包是否有問題。之前看過spring掃描包的源碼。如果想將一個接口掃描到spring容器中,必須在他的實現類上面加上@Service。這樣在掃面他的實現類的時候就會把這個實現類的依賴接口有添加到spring容器中了。
如果單單打包一個api的接口是不會有實現類去引用這個接口的,所以就不會掃描到這個接口也不會將接口加載到spring容器中。所以只需要將整個provider打包後纔會掃描到這個接口,纔會註冊到spring容器中。
對於maven打包的這個問題,本次我是在排查問題中反向想到的。其實真正使用maven打包的api jar包也是需要將整個父項目打包的。還是maven基礎差啊。