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