在IDEA中有多个子模块,经常会出现其他项目需要引用到该子模块。这个时候往往需要将子模块发布到私有仓库。如果直接在子模块上maven deploy
会出现无法正常引用的问题(如:Dependencies
出现波浪线,无法下载jar包导致本地maven repository
中没有jar包等问题)。
目录层级
在项目中可能会用到子模块sub-module
或者子子模块sub-sub-module
,这里举一个子子模块的例子。
假如项目AProject层级结构如下,而子子模块AProject-a-api
需要部署到maven私服给项目B使用。子模块依层级向上依赖父级pom。
|-AProject(root)
|--- AProject-a
| |-- AProject-a-api #需要deployed给项目B使用
| |-- AProject-a-server
|---AProject-b
问题
如果直接在AProject-a-api
目录执行mvn deploy
会无法使用,因为AProject-a-api
依赖了Parent父级AProject-a
的pom,而AProject-a
又依赖了根级AProject
的pom。直接将a-api
部署到私服时,会因为找不到Parent pom
无法打包或者打包后无法正常使用。
解决方法
综上所述,只需要将父级pom
一起发布就能解决问题了。那么在parent
的pom
下执行mvn deploy
, 这样就会自动将parent pom
、sub-module
以及sub-sub-module
都发布到仓库。
1.在根目录AProject pom
中添加distributionManagement
<distributionManagement>
<repository>
<id>maven-releases</id>
<name>Releases</name>
<url>http://www.loamen.com:8081/repository/maven-releases</url>
</repository>
<snapshotRepository>
<id>maven-snapshots</id>
<name>Snapshot</name>
<url>http://www.loamen.com:8081/repository/maven-snapshots</url>
</snapshotRepository>
</distributionManagement>
此处的id
与maven
的setting.xml
配置中的server id
要一一对应,url
也要对应。
<!-- setting.xml远程仓库配置-->
<servers>
<server>
<id>maven-snapshots</id> // 快照仓库 ID
<username>admin</username>
<password>admin1234</password>
</server>
<server>
<id>maven-releases</id> // 发布仓库 ID
<username>admin</username>
<password>admin1234</password>
</server>
</servers>
<profiles>
<profile>
<id>dev</id>
<repositories>
<repository>
<id>maven-snapshots</id>
<name>maven-snapshots</name>
<url>http://www.loamen.com:8081/repository/maven-snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>maven-releases</id>
<name>maven-releases</name>
<url>http://www.loamen.com:8081/repository/maven-releases/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
</profile>
</profiles>
2.忽略发布AProject-b
和AProject-a-server
因为不需要发布子模块AProject-b
和子子模块AProject-a-server
,所以在这两个模块properties设置中忽略发布。
<!--AProject-b子项目pom中修改设置-->
<properties>
<java.version>1.8</java.version>
<maven.deploy.skip>true</maven.deploy.skip> #AProject-b添加跳过deploye设置
</properties>
<!--AProject-a-server子子项目中pom中修改设置-->
<properties>
<java.version>1.8</java.version>
<maven.deploy.skip>true</maven.deploy.skip> #AProject-a-server添加跳过deploye设置
</properties>
3.发布AProject-a-api
模块
切换到AProject
根目录,执行如下操作发布AProject-a-api
子子模块。
命令:mvn deploy -pl 子模块 -am
,这里先clean
一下。
AProject> mvn clean deploy -pl AProject-a/AProject-a-api -am
看到如下消息即是发布成功了,然后到项目B中就可以从maven
私服依赖引用了。
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.292 s
[INFO] Finished at: 2020-04-19T12:30:59+08:00
[INFO] ------------------------------------------------------------------------
mvn命令参数参考:
-am --also-make 同时构建所列模块的依赖模块;
-amd -also-make-dependents 同时构建依赖于所列模块的模块;
-pl --projects <arg> 构建制定的模块,模块间用逗号分隔;
-rf -resume-from <arg> 从指定的模块恢复反应堆。
网友评论