一、背景
为了方便维护管理项目,解决项目依赖及其版本问题;提高代码重复利用率。可以选择通过maven创建一个父级工程,然后由多个第二级工程来继承管理使用。
二、主要配置
该文以CMMS项目为例,介绍该模式的一些简要的使用及配置,至于详细的标签功能及一些maven继承、依赖、聚合等详细内容该文不过多讲解,请自行查找。
1、父pom
(1)创建的父pom必须保证父工程的pom.xml文件中定义的打包packaging标签的类型是pom,一个java项目默认是jar类型,web项目默认是war类型,但是父工程必须是pom类型。
(2)我们想要使用一个工程,通过对这个工程命令执行,就能够同时执行其他多个工程的同一个命令,可以添加聚合标签<modules>实现该功能。
(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指向父工程.这样父工程的一些资源标签就可以被子工程使用了
(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互相依赖,即依赖间不能形成闭环操作。
图中模块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仓库。
2、构建后操作
该方式下maven的构建的jar存放的路径没有在根目录中,具体的路径可通过jenkins的控制输出台查看
所以在上传到其他的环境中时的路径应改成下面的