美文网首页
[Java学习笔记]maven发布子模块到私服

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

作者: Loamen | 来源:发表于2020-04-19 13:15 被阅读0次

    在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> 从指定的模块恢复反应堆。
    

    相关文章

      网友评论

          本文标题:[Java学习笔记]maven发布子模块到私服

          本文链接:https://www.haomeiwen.com/subject/ikiubhtx.html