1.继承
在构建多个模块的时候,往往会多有模块有相同的groupId、version,或者有相同的依赖,为了减少pom文件的配置,跟我们的项目中类的继承一样,在父工程中配置了pom,子项目中的pom可以继承
继承POM的用法
面向对象设计中,程序员可以通过一种类的父子结构,在父类中声明一些字段和方法供子类继承,这样可以做到“一处声明、多处使用”,类似的我们需要创建POM的父子结构,然后在父POM中声明一些配置,供子POM继承。
子工程gropid 和version没写,是因为子工程的groupid 和version 和父工程的一样.所以子工程继承了父工程,但是当子工程的groupid ,version和父工程的不一样的时候,就需要自己重写.父模块只是为了帮助消除配置的重复,因此它本身不包含除POM之外的项目文件,也就不需要src/main/java之类的文件夹了。
<artifactId>integral-kernel-parent</artifactId>
<packaging>pom</packaging>
<parent>
<groupId>com.dmsdbj.cloud</groupId>
<artifactId>cloud-integral-parent</artifactId>
<version>0.0.2-SNAPSHOT</version>
</parent>
在父pom 中定义了整个项目所需要的依赖,如tools等.
<dependencies>
<dependency>
<groupId>com.dmsdbj.cloud</groupId>
<artifactId>cloud-tool</artifactId>
<version>0.0.2-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
可继承的POM元素
groupId:项目组ID,项目坐标的核心元素
version:项目版本,项目坐标的核心元素
description:项目的描述信息
organnization:项目的组织信息
inceptionYear:项目的创始年份
url:项目的URL地址
developers:项目的开发者信息
dependencies:项目的依赖配置
dependencyManagement:项目的依赖管理配置
repositories:项目的仓库配置
build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
依赖管理
当多有模块中有相同的依赖时,我们可以将这些依赖提取出来,同一在父POM中声明,这样就可以简化子模块的配置了,但是这样还是存在问题,当想在项目中加入一些,不需要这么多依赖的模块,如果让这个模块也依赖那些不需要的依赖,显然不合理。
Maven提供的dependentcyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活度。在dependentcyManagement元素下的依赖声明不会引入实际的依赖,而是定义了依赖的版本,对版本进行同一管理,避免出现版本不一致的情况:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencyManagement>
dependencyManagement声明的依赖既不会给项目引入依赖,也不会给它的子模块引入依赖,不过这段配置是会被继承的。真正地引入到项目中是在子项目的pom文件中进行定义声明的.dependencyManagement声明依赖能够统一规范项目中依赖的版本,当依赖的版本在父POM中声明之后,子模块在使用依赖的时候就无效声明版本,也就不会发生多个子模块使用依赖版本不一致的情况。这可以降低依赖冲突的几率。
2.聚合
在我们的项目中有controller,service,dao层,每一个里面都有pom文件,在构建的需要把每一个都进行构建,但是有了聚合,我们创建一个额外的模块。然后通过该模块,来构建整个项目的所有模块把他们聚合到一起,能够使用一条命令就构建多个模块,聚合工程的结构如下:
pom文件如下:
<parent>
<artifactId>e3-parent</artifactId>
<groupId>cn.e3mall</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../e3parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cn-manager</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>e3-manager-pojo</module>
<module>e3-manager-dao</module>
<module>e3-manager-interface</module>
<module>e3-manager-service</module>
<module>e3-manager-web</module>
</modules>
<packaging>pom</packaging>
一个特殊的地方就是packaging,其值为pom,如果没有声明的话,默认为jar,对于聚合模块来说,其打包方式必须为pom,否则无法构建。
modules里的每一个module都可以用来指定一个被聚合模块,这里每个module的值都是一个当前pom的相对位置。
3.继承与聚合的关系
继承是为了减少配置,配置是为了方便快速构建项目.
继承:在子工程的pom 文件中定义元素
聚合:它知道有哪些被聚合的模块,但那些被聚合的子模块不知道这个聚合模块的存在.
中的元素就是要被聚合的模块.
为了方便,有的工程既是聚合工程也是父工程.