如果项目是基于一个父项目(pom依赖),下面多个子module进行构建的项目,发布到maven私服的时候往往会出现相互依赖的问题。通常情况下需要每个项目都单独的进行maven私服上传而不是关系性上传所有。特别是针对父pom的上传,不能因为上次父pom依赖,而将所有的项目都上传到私服。

针对这种问题,该如何解决呢?下面来逐步解答。先看看多模块项目的结构:

maven多模块,父项目pom发布到maven私服插图

如果直接执行maven clean deploy进行子项目的发布,会出现如下错误:

maven多模块,父项目pom发布到maven私服插图1

主要原因是子项目进行发布时需要下载父项目的pom依赖。

如果此时直接针对父项目执行上述命令,又会将所有的子项目给发布到私服上。

解决方案一

此时就需要采用maven的-N参数,如下命令进行发布:

mvn clean package deploy -Dmaven.test.skip=true -Drepository:snapshots -N

上述命令在父项目的根目录下进行执行,即可将父项目的pom发布到私服上。

mvn参数-N –non-recursive Do not recurse into sub-projects,意思是,不递归到子项目(子模块)。

一个父项目下Father面有3个子项目A、B、C,都生成jar包,则有Father.jar、A.jar、B.jar、C.jar;此时A项目依赖了B、C项目,如果使用mvn clean install -N,则只会把Father.jar安装到本地仓库(~/.m2/repository),而不会安装其他三个包。

解决方案二

通过 maven-deploy-plugin 插件的参数来控制:

<properties>
  <maven.deploy.skip>true</maven.deploy.skip>
</properties>

哪个项目不需要发布就加上这个属性,即可。但这种方案不具备第一种方案的灵活性。需要不停的修改该配置。

解决方案三

只用deploy命令不会把父模块的引用关系一起发布。使用“deploy -pl 模块名 -am”命令代替单纯的deploy命令。

解决方案四

maven-source-plugin相关配置。多模块项目和普通一个项目的配置是有区别的,需要在每个需要上传源码的子模块中都配置maven-source-plugin才可以上传:

非多模块项目:

<plugins>
   <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-source-plugin</artifactId>
      <version>3.0.1</version>
      <configuration>
         <attach>true</attach>
      </configuration>
      <executions>
         <execution>
            <phase>compile</phase>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
      </executions>
  </plugin>
</plugins>

多模块项目,在父pom中增加:

<pluginManagement>
   <plugins>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-source-plugin</artifactId>
          <version>3.0.1</version>
          <configuration>
             <attach>true</attach>
          </configuration>
             <executions>
                 <execution>
                     <phase>compile</phase>
                         <goals>
                            <goal>jar</goal>
                         </goals>
                 </execution>
            </executions>
        </plugin>
    </plugins>
</pluginManagement>

子项目中增加:

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

然后使用:mvn deploy 既可将源码上传到私服中



maven多模块,父项目pom发布到maven私服插图2

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://choupangxia.com/2021/01/18/maven-pom/