問題現象:項目結構如下
growup-service
| - - - - - -growup-api
| - - - - - -growup-core
| - - - - - -growup-war
通過maven打包后出現growup-core依賴本地工程growup-api,growup-war也依賴了本地工程growup-api,但growup-war依賴的是本地倉庫里的growup-core,而不是本地工程的growup-core。這時war包引用的是本地倉庫里打好core的jar包,因此調試war包引用到core的class文件了。
問題解決與定位:這里其實應該是兩個問題,第一個問題是為什么依賴會出問題,依賴不了本地core子項目,第二個問題是怎么解決調試war包時調到core包的java文件而不是編譯后的class文件。第二個問題是表象,我們可以通過添加源碼解決,這個辦法也適用於debug開源代碼。日常的項目中,我們會導入一些依賴的開源jar包或者其他項目jar包,但並不會把整個項目導入到eclipse中來,因為我們只要引用而無需修改。但是調試的話會跳到被引用jar包里的class文件,要么是調試顯示不了代碼,要么顯示的是class文件,格式怪異。為了解決這兩個顯示問題,只需要把源碼導入到依賴路徑中即可。如上面的問題,我只需要右擊war包的項目 -> 點擊Build Path -> Configure Build Path -> Java Build Path -> 點開Maven Dependencies -> 找到被引用的牛奶瓶,即core項目的jar包 -> 點開左邊的箭頭 -> 點擊Source attchment -> 點Edit -> 選擇該jar包所對應的源碼包(這里是我本地工程core項目) -> 點OK。
針對本問題,以上操作可以解決debug跳轉到class文件顯示奇怪的問題,但實際上治標不治本。為什么這么說呢?回到maven打包現象來,在打war包時core包是從倉庫里下載的,說明它找不到本地項目,所以我特意去看了war包的pom文件:
<dependency> <groupId>cn.wlf.wulinfeng</groupId> <artifactId>growup-core</artifactId> <version>0.4.0-SNAPSHOT</version> </dependency>
然后我又看了core包的pom文件:
<artifactId>growup-core</artifactId> <version>0.4.0</version> <packaging>jar</packaging>
從版本號可以很明顯的看出,這是兩個core包。war包里依賴了的growup-core-0.4.0-SNAPSHOT,而本地的core打出來的叫growup-core-0.4.0,當然無法依賴了,所以它只能去倉庫里下載growup-core-0.4.0-SNAPSHOT來依賴。上面解決第二個問題的做法實際上是把war包里依賴的growup-core-0.4.0-SNAPSHOT包的源碼包設置未本地項目的growup-core-0.4.0而已。
到這里解決第一個問題的辦法一目了然:修改version一致,重新打包。