1. 程式人生 > >Maven多模組專案打包前的一些注意事項(打包失敗)

Maven多模組專案打包前的一些注意事項(打包失敗)

一、

最近在打包Maven專案時遇到了點問題,這個專案是Maven多模組專案,結構如下:

projectParent
├── xxxx-basic
├── xxxx-web1
├── xxxx-collector
└── xxxx-web2


projectParent 為父專案,無任何程式碼,就是個空殼,<packaging>pom</packaging>;
xxxx-basic 為基礎專案,它依賴於projectParent,裡面含有一些model、dao、xml等,下面三個專案都依賴它,<packaging>jar</packaging>;

xxxx-web1 為web專案,它依賴於xxxx-basic,<packaging>war</packaging>;
xxxx-collector 為springboot專案,它依賴於xxxx-basic,可單獨啟動,不用管它。
xxxx-web2 為web專案,它依賴於xxxx-basic,<packaging>war</packaging>;

 

二、

現在要釋出xxxx-web2到伺服器,打包xxxx-web2時,報以下錯誤:

 

1 [WARNING] The POM for com.zc:xxxx-basic:jar:0.0.1-SNAPSHOT is missing, no dependency information available
2 [ERROR] Failed to execute goal on project xxxx-web2: Could not resolve dependencies for project com.zc:xxxx-web2:war:0.0.1-SNAPSHOT: Could not find artifact com.zc:xxxx-basic:jar:0.0.1-SNAPSHOT in nexus-aliyun (http://maven.aliyun.com/nexus/content/groups/public) -> [Help 1]

 


從打印出來的日誌可以看出,無法找到 com.zc:xxxx-basic:jar:0.0.1-SNAPSHOT 在nexus-aliyun(阿里雲私服)

xxxx-basic明明是本地專案,為什麼會去nexus-aliyun下載呢?


這裡解釋一下,Maven在下載依賴時會先在本地倉庫查詢,如若未找到,則會去內網私服查詢,如若仍未找到,再去遠端倉庫查詢。
去本地倉庫看了一下,很明瞭,本地倉庫沒有xxxx-basic:jar:0.0.1-SNAPSHOT,內網私服也沒搭建,所以它直接去遠端倉庫找了(我們的遠端倉庫配置的阿里雲私服),直到最後未找到,報錯。

三、

先去釋出(install)xxxx-basic模組到本地倉庫,再打包xxxx-web2

釋出(install) xxxx-basic模組到本地倉庫 成功(如上圖)。

 

而打包 xxxx-web2 時又失敗(如上圖)。

1 [ERROR] Failed to execute goal on project xxxx-web2: Could not resolve dependencies for project com.zc:xxxx-web2:war:0.0.1-SNAPSHOT: Failed to collect dependencies at com.zc:xxxx-basic:jar:0.0.1-SNAPSHOT: Failed to read artifact descriptor for com.zc:xxxx-basic:jar:0.0.1-SNAPSHOT: Could not find artifact com.zc:projectParent:pom:0.0.1-SNAPSHOT in nexus-aliyun (http://maven.aliyun.com/nexus/content/groups/public) -> [Help 1]


只看最後一句,無法找到 com.zc:projectParent:pom:0.0.1-SNAPSHOT在nexus-aliyun(阿里雲私服)

很顯然,和上一個錯誤一樣。xxxx-web2 依賴 xxxx-basic,而 xxxx-basic 依賴於projectParent,projectParent的pom在本地倉庫沒有,所以Maven又去遠端倉庫查詢,未找到,報錯。

這樣再把父專案的pom釋出(install)到本地倉庫就可以了。在這裡需要注意的是,當 install 整個父專案時,它下面的 所有子模組專案 也會一同釋出到本地倉庫。比較費時,有些模組又不需要,放在本地倉庫還佔空間。

 

針對這種父專案 install 時,兩種解決方法:

1、直接install父專案,等待一會,全部發布成功後,在本地倉庫中查詢到其餘不用的模組,直接刪除,不再佔用磁碟空間。

2、在不需要釋出到本地倉庫的 '子模組專案' 的pom.xml內加入

1 <properties>
2     <maven.install.skip>true</maven.install.skip>
3 </properties>

 

詳情可檢視官網介紹(http://maven.apache.org/plugins/maven-install-plugin/install-mojo.html)

 


四、

釋出 (install) projectParent 父專案到本地倉庫,跳過其餘四個子模組專案,成功。

 


projectParent模組、xxxx-basic模組在本地倉庫都有了,之後再去打包 xxxx-web2 就成功了。
(父模組基本不會改,一般不需要重新發布;xxxx-basic在某些需求下,會改動,改動就重新發布,未改動無需重新發布;)