一:聚合
1·何为聚合?
是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系
2·聚合的引入为了解决什么样的问题?
在开发中,如果有两个或两个以上独立的maven 工程,则不可避免的一个操作就是分别执行mvn命令,那为了能够使用一条命令就能构件这两个子模块,那maven聚合就应运而生了。
3·如何实现?
例如:我们现在的项目目录结构如图所示:
我们需要创建一个子目录:itoo_basic_teacher_aggregator,然后在该目录结构下创建一个pom.xml文件,(记得转换为maven项目)现在的项目目录结构如图所示:
itoo_basic_teacher_aggregator本身作为一个maven项目,它必须有自己的pom文件,且仅有一个pom文件,这是因为聚合模块仅仅是帮助聚合其他模块构建的工具,本身并无实质性的内容。但做为一个聚合项目,其pom结构又不同于其它单独项目,特殊地方在于<modules>标签:
<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>
<parent>
<groupId>com.dynamic</groupId>
<artifactId>itoo-basic-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../itoo-basic-parent/pom.xml</relativePath>
</parent>
<artifactId>itoo-basic-teacher-aggregator</artifactId>
<packaging>pom</packaging>
<name>itoo-basic-teacher-aggregator</name>
<description>aggregate itoo-basic-teacher modules</description>
<!---实现聚合的核心配置:module值代表当前pom的相对目录-->
<modules>
<module>../itoo-basic-teacher-core</module>
<module>../itoo-basic-teacher-web</module>
<module>../itoo-basic-teacher-ear</module>
</modules>
</project>
注意两点:
1·对于聚合模块,期打包方式packaging标签值必须为pom,否则无法完成构建。
2·关于目录结构:
a.聚合模块和其他子模块为父子关系:路径如图所示
<modules>
<module>itoo-basic-teacher-core</module>
<module>itoo-basic-teacher-web</module>
<module>itoo-basic-teacher-ear</module>
</modules>
b.
聚合模块和其他子模块为平行关系:路径如图所示(上例中为平级目录结构)
<modules>
<module>../itoo-basic-teacher-core</module>
<module>../itoo-basic-teacher-web</module>
<module>../itoo-basic-teacher-ear</module>
</modules>
聚合模块运行mvn cleaninstall命令的输出效果图:
大致内容为:该聚合工程构建的小结报告,包括各个模块构建是否成功,以及各个工程构建花费的时间,以及整个构建花费的时间以及内存的占用情况等。
二:继承
1·何为继承?
继承既是一种父与子的关系
2·继承的引入为了解决什么样的问题?
当我们各个子项目的pom文件中引入相同的依赖或是相同的配置(例如相同的groupId和version),这 就意味着“重复”,这个时候,maven继承在一定程度上就可以帮助我们消除重复。
3·如何实现?
在项目列表中添加一个itoo-basic-teacher-parent子目录,同样,在该目录下添加一个pom.xml文件(同理,记得转换为maven项目),由于父模块只是为了帮助消除配置的重复,所以parent本身也不需要其它文件,只要有pom.xml文件即可。
itoo-basic-teacher-parent的pom.xml文件如下:
<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指定了当前POM模型的版本-->
<modelVersion>4.0.0</modelVersion>
<groupId>com.dynamic</groupId>
<artifactId>itoo-basic-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
</project>
而子模块的pom.xml文件需要添加父模块的节点,如下:
<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>
<parent>
<groupId>com.dynamic</groupId>
<artifactId>itoo-basic-teacher-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../itoo-basic-teacher-parentr/pom.xml</relativePath>
</parent>
<artifactId>itoo-basic-teacher-core</artifactId>
<packaging>ejb</packaging>
</project>
这里就要使用到标签dependencyManagement了。该元素技能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。怎么解释:意思就是,在dependencyManagement元素下的依赖声明不会引入实际的依赖,不过它能约束dependencies下的依赖使用。parent中添加如下配置:
<prperties>
<spring.version>4.0.9.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
4·疑问?
有人可能会觉得,这种依赖管理机制看起来不会减少太多的pom配置,为什么不在父模块中直接使用dependencies呢?这样子模块不就可以直接继承并且不需要声明了吗?
这样会导致两个问题的产生:
1·如果再在父模块下添加一个子模块,如果子模块不需要相关的spring包,这样方式也会将spring相关的jar传递依赖给该子模块,所以,子模块将失去灵活可配置性。
2·子模块中不能明显的看到该子模块所依赖的jar包。如果工程巨大,给管理会造成不便。
综上所述,maven的最佳实践中提到:使用dependencyManagement管理父类依赖。
三:聚合和继承关系
相同点:pom文件的<packaging>都必须是pom格式。
不同点:聚合模块主要是为了方便快速的构建项目,继承主要是为了消除重复配置。