一、
最近在打包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在某些需求下,会改动,改动就重新发布,未改动无需重新发布;)