@[toc] 因為最近有小夥伴問到了,是以我想和大家随便扯扯 Maven 項目中代碼的組織形式這個問題。
其實也不是啥大問題,但是如果不懂的話,就像霧裡看花,始終不能看的明明白白,懂了就像一層窗戶紙,捅破就好了。
是以我們就簡單扯幾句。
首先來說說代碼組織形式。
一般來說,就兩種比較常見的形式:
平鋪
父子結構
這兩種形式松哥在不同的項目中都有遇到過,是以我們就不說孰優孰劣,單純來說這兩種方案。
平鋪的代碼類似下面這樣:
如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yNyYTMzcTZhNDN1YGZ2QjNxYzXxQTMwEDMyEzLcBTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL2M3Lc9CX6MHc0RHaiojIsJye.png)
可以看到,在這種結構下,parent 父工程和各個子工程從代碼組織形式上來看都是平級的,都處于同一個目錄下。
不過仔細檢視 pom.xml 檔案,還是能夠清晰的看到這三個 module 的父子關系的:
parent:
可以看到,在指定 module 時,由于 vhr-dao 和 vhr-service 和 parent 的 pom.xml 不在同一個目錄下,是以這裡使用了相對路徑,相對路徑的參考依據是 parent 的 pom.xml 檔案位置。
vhr-dao:
可以看到,relativePath 節點中,通過相對路徑指定了 parent 的 pom.xml 檔案位置,這個相對路徑的參考依據是子子產品的 pom.xml 檔案。
vhr-service:
這個和 vhr-dao 的差不多,不贅述。
父子結構則類似于下面這樣:
這種父子結構的看起來就非常的層次分明了,parent 和各個 module 一眼就能看出來,我們從 GitHub 上下載下傳的很多開源項目如 Shiro,都是這種結構。
不過檔案夾的層級并不能說明任何問題,關鍵還是要看 pom.xml 中的定義,接下來我們就來看看 parent 的 pom.xml 和各個子子產品的 pom.xml 有何異同。
maven_parent:
和前面不同的是,這裡聲明 modules 不需要相對路徑了(其實還是相對路徑,隻是不需要 <code>../</code> 了),因為各個子子產品和 parent 的 pom.xml 檔案處于同一目錄下。
這裡也不需要通過 relativePath 節點去指定 parent 的 pom.xml 檔案位置了,因為 parent 的 pom.xml 和各個子子產品處于同一目錄下。
有的時候,單純隻是想通過 parent 來統一管理不同的項目的依賴,并非一個聚合項目。
這個時候隻需要去掉 parent 的 pom.xml 中的 modules 節點及其中的内容即可,這樣就不是聚合工程了,各個子子產品也可以獨立打包。
當然很多情況我們是聚合工程。
聚合工程的話,一般松哥是建議大家從 parent 處統一進行打包:
這樣可以確定打包到的是最新的代碼。
當然還有另外一種操作流程:
首先将 parent 安裝到本地倉庫。
然後分别将 model、dao 以及 service 等子產品安裝到本地倉庫。
最後 web 子產品就可以獨立打包了。
如果使用這種操作流程,需要注意一點,就是每個子產品代碼更新之後,要及時安裝到本地倉庫,否則當 web 子產品獨立打包時,用到的其他子產品就不是最新的代碼。
好啦,幾個 Maven 中的小問題,窗戶紙捅破了就豁然開朗啦~