[Java学习笔记]maven发布子模块到私服

在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一起发布就能解决问题了。那么在parentpom下执行mvn deploy, 这样就会自动将parent pomsub-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>

此处的idmavensetting.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-bAProject-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> 从指定的模块恢复反应堆。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。