天天看點

閑扯Maven項目代碼組織形式

@[toc] 因為最近有小夥伴問到了,是以我想和大家随便扯扯 Maven 項目中代碼的組織形式這個問題。

其實也不是啥大問題,但是如果不懂的話,就像霧裡看花,始終不能看的明明白白,懂了就像一層窗戶紙,捅破就好了。

是以我們就簡單扯幾句。

首先來說說代碼組織形式。

一般來說,就兩種比較常見的形式:

平鋪

父子結構

這兩種形式松哥在不同的項目中都有遇到過,是以我們就不說孰優孰劣,單純來說這兩種方案。

平鋪的代碼類似下面這樣:

如下圖:

閑扯Maven項目代碼組織形式

可以看到,在這種結構下,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 的差不多,不贅述。

父子結構則類似于下面這樣:

閑扯Maven項目代碼組織形式

這種父子結構的看起來就非常的層次分明了,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 處統一進行打包:

閑扯Maven項目代碼組織形式

這樣可以確定打包到的是最新的代碼。

當然還有另外一種操作流程:

首先将 parent 安裝到本地倉庫。

然後分别将 model、dao 以及 service 等子產品安裝到本地倉庫。

最後 web 子產品就可以獨立打包了。

如果使用這種操作流程,需要注意一點,就是每個子產品代碼更新之後,要及時安裝到本地倉庫,否則當 web 子產品獨立打包時,用到的其他子產品就不是最新的代碼。

好啦,幾個 Maven 中的小問題,窗戶紙捅破了就豁然開朗啦~