本篇内容
-
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
,如下:
点击Next
,输入项目坐标信息,如下:
点击Next
,输入Project name 为javacode2018-pc
,如下:
点击Finish
,创建成功,如下:
配置一下idea的maven环境,点击File->Settings
,如下图:
点击上面的OK
完成配置。
大家再按照上面一样的操作,分别创建另外2个项目javacode2018-h5
和javacode2018-api
,创建完成之后,另外2个项目如下图:
上面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项目中加入如下配置:
<modules>
<module>模块1</module>
<module>模块2</module>
<module>模块n</module>
</modules>
<package>pom</package>
新的项目中执行任何
mvn
命令,都会modules
中包含的所有模块执行同样的命令,而被包含的模块不需要做任何特殊的配置,正常的maven项目就行。注意上面的
module
元素,这部分是被聚合的模块pom.xml
所在目录的相对路径。package的值必须为pom,这个需要注意。
下面看案例。
实操案例
下面过程仔细看了。
创建项目`javacode-aggregator`
打开idea,点击File->New->Project
,选择Maven
,如下:
点击Next
,输入项目坐标信息,如下:
点击Next
,输入Project name 为javacode-aggregator
,如下:
点击Finish
,创建成功,如下:
配置一下idea的maven环境,点击File->Settings
,如下图:
删除下面无用的代码:
项目变成了下面这样:
pom.xml
中加入下面配置:
<packaging>pom</packaging>
最后pom.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project 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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javacode2018</groupId>
<artifactId>javacode-aggregator</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
</project>
创建`javacode2018-pc` 模块
注意这里说的是模块,不再是创建项目,过程仔细看。
idea中选中javacode-aggregator
点击File->New->Module
,准备创建模块,如下图:
选择Maven
,如图:
点击Next
,如下:
点击下面的...
按钮,选择None
,如下:
输入坐标信息,如下:
点击Next
,输入Module name :javacode2018-pc
,如下:
点击Finish
,完成javacode-2018
模块的创建,如下:
我们来看一下javacode-aggregator
的pom.xml,多了一部分,如下:
注意上面的
<packaging>pom</packaging>
创建javacode2018-h5模块
创建步骤和上面javacode2018-pc
步骤一样。
创建javacode2018-api模块
创建步骤和上面javacode2018-pc
步骤一样。
我们看一下项目最终结构,如下图:
看一下上图中的javacode-aggregator
项目的pom.xml
,modules
元素中多出了3部分。
再来看看其他3个模块的pom文件,和普通的pom.xml一样,如下图:
在javacode-aggregator/pom.xml
目录中执行mvn package
感受一下效果:
D:\code\IdeaProjects\javacode-aggregator>mvn package
[INFO] Scanning for 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 (default-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 (default-compile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-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 (default-testCompile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-pc ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-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 (default-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 (default-compile) @ javacode2018-h5 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-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 (default-testCompile) @ javacode2018-h5 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-h5 ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-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 (default-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 (default-compile) @ javacode2018-api ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-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 (default-testCompile) @ javacode2018-api ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-api ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-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 for 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个都执行成功了,我们来看一下最终产生的效果,如下图:
从上图中我们可以看到3个模块都生成了jar包,说明我们执行了一次mvn package
,分别在3个模块中都运行了,我们在来执行一下mvn clean
清理代码,感受一下最终效果:
D:\code\IdeaProjects\javacode-aggregator>mvn clean
[INFO] Scanning for 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-clean-plugin:2.5:clean (default-clean) @ jav