一、背景

为了方便维护管理项目,解决项目依赖及其版本问题;提高代码重复利用率。可以选择通过maven创建一个父级工程,然后由多个第二级工程来继承管理使用。

二、主要配置

该文以CMMS项目为例,介绍该模式的一些简要的使用及配置,至于详细的标签功能及一些maven继承、依赖、聚合等详细内容该文不过多讲解,请自行查找。

1、父pom

 (1)创建的父pom必须保证父工程的pom.xml文件中定义的打包packaging标签的类型是pom,一个java项目默认是jar类型,web项目默认是war类型,但是父工程必须是pom类型。

jenkins 构建maven项目 ssh servers jenkins构建maven多模块项目_maven

 

(2)我们想要使用一个工程,通过对这个工程命令执行,就能够同时执行其他多个工程的同一个命令,可以添加聚合标签<modules>实现该功能。

           

jenkins 构建maven项目 ssh servers jenkins构建maven多模块项目_spring_02

 

(3)管理依赖的版本(☆)

当项目中使用<dependencyManagement>标签管理大量依赖时,并不会在项目中直接使用依赖.而是当你使用到其中的某些依赖时,不需要添加版本号。这个标签用的最多的还是在父工程中实现依赖的版本管理,从而子工程不会强制使用这些依赖,只会继承依赖管理中的版本号,这样可以留给子工程选择的空间

  • 父工程:在依赖管理中添加spring-beans依赖
<dependencyManagement>
    <dependencies>
       <dependency>
           <groupId>redis.clients</groupId>
           <artifactId>jedis</artifactId>
           <version>3.1.0</version>
       </dependency>
    </dependencies>
</dependencyManagement>

 

2、子Pom

(1)在子工程中使用<parent>标签,定义groupId artifactId version指向父工程.这样父工程的一些资源标签就可以被子工程使用了

jenkins 构建maven项目 ssh servers jenkins构建maven多模块项目_ci_03

 

(2)依赖的版本由父工程指定

  • 子工程

在依赖中只需要填写groupId artifactId,version直接继承自父工程

dependencies>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>
</dependencies>

(3)在需要执行的springboot子项目pom文件中加入build插件。

<build>
    <plugins>
       <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
       </plugin>
     </plugins>
</build>

三、规范

1、为了管理引用的jar包的版本统一,强烈建议将依赖的<version>放入父项目的<dependencyManagement>中,子项目只需要需要填写groupId artifactId,而版本标签version直接继承自父工程;子项目最好不要出现版本号。

2、定义父项目版本时本地开发测试建议在版本号后面添加后缀SNAPSHOT说明是快照版本(如<version>1.0-SNAPSHOT</version>)。若是生产发行版建议修改为RELEASE(如<version>1.0-SNAPSHOT</version>)。

3、子model中禁止不同的madel互相依赖,即依赖间不能形成闭环操作。

jenkins 构建maven项目 ssh servers jenkins构建maven多模块项目_maven_04

 

图中模块C依赖于模块B,模块B依赖于模块A,而模块A又依赖于模块C,这样就出现了相互依赖情况,如果运行mvn compile会出现异常 :The projects in the reactor contain a cyclic reference。

可以通过重构解决上面问题

(1)第一个办法是平移,比如A和B互相依赖,那么可以将B依赖A的那部分代码,移动到工程B中,这样一来,B就不需要继续依赖A,只要A依赖B就可以了,从而消除循环依赖
(2)第二个办法是下移,比如A和B互相依赖,同时它们都依赖C,那么可以将B和A相互依赖的那部分代码,移动到工程C里,这样一来,A和B相互之间都不依赖,只继续依赖C,也可以消除循环依赖
这两种重构方式都是可行的,具体采用哪种方式要根据实际情况来判断。

四、Jenkins

 jenkins 可以实现单独打包子项目,而不是打包所有项目(浪费时间)。

1、Build

将build中的命令改成clean install -pl curry-a

这样就单独构建curry-a这个jar,相关依赖也会构建好,不用将依赖提前放入maven仓库。

jenkins 构建maven项目 ssh servers jenkins构建maven多模块项目_jenkins_05

 

2、构建后操作

该方式下maven的构建的jar存放的路径没有在根目录中,具体的路径可通过jenkins的控制输出台查看

jenkins 构建maven项目 ssh servers jenkins构建maven多模块项目_ci_06

 

所以在上传到其他的环境中时的路径应改成下面的

jenkins 构建maven项目 ssh servers jenkins构建maven多模块项目_jenkins_07