一、
最近在打包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在某些需求下,會改動,改動就重新發布,未改動無需重新發布;)