第7篇:聚合、继承、裁剪详解
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。
这是maven系列第7篇。
整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。
本篇内容
-
maven中聚合详解
-
maven中继承详解
-
pom.xml中parent元素的使用详解
-
pom.xml中dependencyManagement元素使用详解
-
pom.xml中pluginManagement元素使用详解
-
单继承存在的问题及解决方案详解(springboot,springcloud中会常用)
-
解答上一篇遗留的2个问题
聚合
原始需求
我们需要使用java做一个电商网站,涉及到:pc端网站、h5微站、移动端接口部分,那么我们可以使用maven创建3个项目用于这3块业务的开发,3个项目名称如下:
javacode2018-pc
javacode2018-h5
javacode2018-api
这3个项目的groupId都是com.javacode2018
,artifactId取上面的,我们使用maven来搭建项目结构。
实现
创建第一个javacode2018-pc项目
打开idea,点击File->New->Project
,选择Maven
,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wnopbeb1-1629908643575)(media/5495dab8d35333eaf504ccada1c80472.png)]
点击Next
,输入项目坐标信息,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QBMQkOc6-1629908643578)(media/fe0eceb05f4a47f49e67e5e901605d7f.png)]
点击Next
,输入Project name 为javacode2018-pc
,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oyhc4gzI-1629908643580)(media/29030d929d89f5f38bba663a15700667.png)]
点击Finish
,创建成功,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NhUDvczO-1629908643584)(media/3abc937922b138518e0c5bc98e225eba.png)]
配置一下idea的maven环境,点击File->Settings
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U0t6KHDv-1629908643587)(media/2192b368118bd0f4428611d2863e0104.png)]
点击上面的OK
完成配置。
大家再按照上面一样的操作,分别创建另外2个项目javacode2018-h5
和javacode2018-api
,创建完成之后,另外2个项目如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I9Q0gdhI-1629908643589)(media/c081756ad5a5dec9960ce0369b2ab33d.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E15iDtBE-1629908643591)(media/b222e2f4f7639836561aa491280d5e61.png)]
上面3个项目由整个项目组6个人共同开发,这几个项目经常一起上线,上线过程,先由开发进行打包,然后将几个包发给运行进行发布。我们使用mvn package
进行打包,需要在每个项目的pom.xml
所在目录都去执行一次这个命令,也就是说需要执行3次,这个电商项目还会涉及到后台系统、bi系统、监控系统等等,可能最后会多达10个小项目,那时候我们每次上线都需要执行10次打包操作,这个过程是相当繁琐的。
那么maven有没有更好的办法来解决这个事情呢?
这个用到的就是我们本次要说的maven中的聚合
。
整个电商我们可以作为一个大的系统,上面的pc端、h5微站、api接口、后台系统、bi系统、监控系统都可以作为里面的一个具体比较大一个模块。
我们使用maven聚合
功能来实现上面的需求,我们需要创建一个额外的maven项目javacode-aggregator
来管理上面3个项目,然后只用在javacode-aggregator
项目中执行mvn
命令,就会自动为其他3个项目自动执行同样的mvn
命令。
Maven聚合
maven聚合需要创建一个新的maven项目,
用来管理其他的maven构件模块,新的maven项目中加入如下配置:
模块1
模块2
模块n
pom
新的项目中执行任何
mvn
命令,都会modules
中包含的所有模块执行同样的命令,而被包含的模块不需要做任何特殊的配置,正常的maven项目就行。
注意上面的
module
元素,这部分是被聚合的模块pom.xml
所在目录的相对路径。
package的值必须为pom,这个需要注意。
下面看案例。
实操案例
下面过程仔细看了。
创建项目javacode-aggregator
打开idea,点击File->New->Project
,选择Maven
,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b3ycMtis-1629908643593)(media/5fe79320f3121fa0f77b7814cef732f4.png)]
点击Next
,输入项目坐标信息,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1O7xZEJ7-1629908643594)(media/35a1862a624ea903376b40b59eb40272.png)]
点击Next
,输入Project name 为javacode-aggregator
,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yby4PVkR-1629908643596)(media/856bd4604b9acd1c15fccfb567918a04.png)]
点击Finish
,创建成功,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIh1bAb9-1629908643598)(media/be7a9859c715fcc7d7d3f6f7daee3296.png)]
配置一下idea的maven环境,点击File->Settings
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7iHpy3qW-1629908643600)(media/f97e36ee7190a54a25898f94cc473a3f.png)]
删除下面无用的代码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2EQ3ZPQM-1629908643602)(media/2fd979f631f02c3e8bc3ff10a0556aa6.png)]
项目变成了下面这样:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FdRVnAaW-1629908643603)(media/b87e5c9ac35d21e0b75b8eda1758f9fb.png)]
pom.xml
中加入下面配置:
pom
最后pom.xml内容如下:
version="1.0" encoding="UTF-8"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
4.0.0
com.javacode2018
javacode-aggregator
1.0-SNAPSHOT
pom
创建javacode2018-pc
模块
注意这里说的是模块,不再是创建项目,过程仔细看。
idea中选中javacode-aggregator
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Fg0MkPJ-1629908643604)(media/f238a8f80fb9cef1bacd645bc898e3e2.png)]
点击File->New->Module
,准备创建模块,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SlXHDGsJ-1629908643606)(media/19174965278aef2ae108a5b93f5c086d.png)]
选择Maven
,如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OYxqQNia-1629908643607)(media/330b6c121aa3a098da6fee41fd04b766.png)]
点击Next
,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2OlXlNmi-1629908643608)(media/6e249763d4a77525a94055cf45094f88.png)]
点击下面的...
按钮,选择None
,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eFV4gBmZ-1629908643610)(media/989cfcefbc1511dd89324484dca1ee87.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F3ZT9DOC-1629908643611)(media/7701f097a003ad73e8f0ca92f20c4fcb.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9y6g4P3R-1629908643612)(media/80a4f0da4e987900ce6bcac43e50675e.png)]
输入坐标信息,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mK7xQGl6-1629908643613)(media/e0401424971203a1cccbed537968315a.png)]
点击Next
,输入Module name :javacode2018-pc
,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-69itF21C-1629908643615)(media/287b506e953fb1eb1b8554936c5c88f8.png)]
点击Finish
,完成javacode-2018
模块的创建,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KtdqmlDO-1629908643616)(media/a24a5fad16de8b477d8781ddf7089888.png)]
我们来看一下javacode-aggregator
的pom.xml,多了一部分,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mUc5SD8i-1629908643618)(media/3cd5fb79c34cef6c4d61c4fdb426d9ed.png)]
注意上面的
<packaging>pom</packaging>
创建javacode2018-h5模块
创建步骤和上面javacode2018-pc
步骤一样。
创建javacode2018-api模块
创建步骤和上面javacode2018-pc
步骤一样。
我们看一下项目最终结构,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PoRNRtvv-1629908643619)(media/89fd5eced5fdffff31382b6665c9193b.png)]
看一下上图中的javacode-aggregator
项目的pom.xml
,modules
元素中多出了3部分。
再来看看其他3个模块的pom文件,和普通的pom.xml一样,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bTNSZyvc-1629908643620)(media/4b91c2ce72bd5e2a4b6c98fc3087884a.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z7RKSPWr-1629908643621)(media/57f7e732e3524d96e46e61e51d66015b.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MHOW1HVa-1629908643623)(media/4702b48662eae7a491d16ed45e9de0d6.png)]
在javacode-aggregator/pom.xml
目录中执行mvn package
感受一下效果:
D:\code\IdeaProjects\javacode-aggregator>mvn
[INFO] Scanning projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] javacode2018-pc [jar]
[INFO] javacode2018-h5 [jar]
[INFO] javacode2018-api [jar]
[INFO] javacode-aggregator [pom]
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-pc >------------------
[INFO] Building javacode2018-pc 1.0-SNAPSHOT [1/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (-resources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (-testResources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode-aggregator\javacode2018-pc\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (-testCompile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (-test) @ javacode2018-pc ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (-jar) @ javacode2018-pc ---
[INFO] Building jar: D:\code\IdeaProjects\javacode-aggregator\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT.jar
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-h5 >------------------
[INFO] Building javacode2018-h5 1.0-SNAPSHOT [2/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (-resources) @ javacode2018-h5 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ javacode2018-h5 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (-testResources) @ javacode2018-h5 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode-aggregator\javacode2018-h5\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (-testCompile) @ javacode2018-h5 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (-test) @ javacode2018-h5 ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (-jar) @ javacode2018-h5 ---
[INFO] Building jar: D:\code\IdeaProjects\javacode-aggregator\javacode2018-h5\target\javacode2018-h5-1.0-SNAPSHOT.jar
[INFO]
[INFO] -----------------< com.javacode2018:javacode2018-api >------------------
[INFO] Building javacode2018-api 1.0-SNAPSHOT [3/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (-resources) @ javacode2018-api ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ javacode2018-api ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (-testResources) @ javacode2018-api ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode-aggregator\javacode2018-api\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (-testCompile) @ javacode2018-api ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (-test) @ javacode2018-api ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (-jar) @ javacode2018-api ---
[INFO] Building jar: D:\code\IdeaProjects\javacode-aggregator\javacode2018-api\target\javacode2018-api-1.0-SNAPSHOT.jar
[INFO]
[INFO] ----------------< com.javacode2018:javacode-aggregator >----------------
[INFO] Building javacode-aggregator 1.0-SNAPSHOT [4/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary javacode-aggregator 1.0-SNAPSHOT:
[INFO]
[INFO] javacode2018-pc .................................SUCCESS [ 2.542 s]
[INFO] javacode2018-h5 .................................SUCCESS [ 0.195 s]
[INFO] javacode2018-api ................................SUCCESS [ 0.218 s]
[INFO] javacode-aggregator .............................SUCCESS [ 0.024 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.223 s
[INFO] Finished at: 2019-11-19T13:28:00+08:00
[INFO] ------------------------------------------------------------------------
我们分析一下上面的输出:
[INFO] Reactor Build Order:
[INFO]
[INFO] javacode2018-pc [jar]
[INFO] javacode2018-h5 [jar]
[INFO] javacode2018-api [jar]
[INFO] javacode-aggregator [pom]
上面这个列出了需要构件的maven构件列表及顺序,共有4个构件,3个jar包,1个pom类型的构件。
然后开始按照上面列出的顺序,一个个开始执行mvn package
命令,最后4个都执行成功了,我们来看一下最终产生的效果,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHnkrJiD-1629908643624)(media/536d01760eb75bbe4cacb03f2817a567.png)]
从上图中我们可以看到3个模块都生成了jar包,说明我们执行了一次mvn package
,分别在3个模块中都运行了,我们在来执行一下mvn clean
清理代码,感受一下最终效果:
D:\co