maven的继承
父模块的打包方式必须为pom,否则无法构建项目。父模块和聚合模块经常可以做到合二为一。
如何配置继承:
- 1.说到继承肯定是一个父子结构,我们先创建一个父工程
- 2.<packaging>: 作为父模块的POM,其打包类型也必须为POM
- 3.结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录
- 4.新的元素:<parent> , 它是被用在子模块中的
- 5.<parent>元素的属性:<relativePath>: 表示父模块POM的相对路径,在构建的时候,Maven会先根据relativePath检查父POM,如果找不到,再从本地仓库查找
- 6.relativePath的默认值: ../pom.xml
- 7.子模块省略groupId和version: 使用了继承的子模块中可以不声明groupId和version, 子模块将隐式的继承父模块的这两个元素.
可被继承的POM元素:
groupId:项目组ID,项目坐标的核心元素
version: 项目版本, 项目坐标的核心元素
description: 项目的描述信息
organization: 项目的组织信息
inceptionYear: 项目的创始年份
url: 项目的URL地址
developers: 项目开发者信息
contributors: 项目的贡献者信息
distributionManagement: 项目的部署配置
issueManagement: 项目的缺陷跟踪系统信息
ciManagement: 项目的持续集成系统信息
scm: 项目的版本控制系统信息
mailingLists: 项目的邮件列表信息
properties: 自定义的maven属性
dependencies: 项目的依赖配置
dependencyManagement: 项目的依赖管理配置
repositories: 项目的仓库配置
build: 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
reporting: 包括项目的报告输出目录配置、报告插件配置等
dependencyManagement属性
我们知道dependencies是可以被继承的,这个时候我们就想到让我们的发生了共用的依赖元素转移到parent中,这样我们又进一步的优化了配置。
可是问题也随之而来,如果有一天我创建了一个新的模块,但是这个模块不需要这些parent的依赖,这时候如何处理?
dependencyManagement也是可以被继承的,这恰恰满足了我们的需要,
它既能够让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性
特性:在dependencyManagement中配置的元素既不会给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>4.0.0</modelVersion>
<groupId>com.zl</groupId>
<artifactId>book-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 项目的设置 -->
<properties>
<!-- 编码的处理 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 定义版本 -->
<mybatis.version>3.4.5</mybatis.version>
<oracle.version>10.2.0.5.0</oracle.version>
</properties>
<!-- 子项目继承依赖的配置,子项目根据实际需求,添加需要的依赖 -->
<dependencyManagement>
<!-- 添加mybatis的依赖 -->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- 添加oracle的依赖 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>${oracle.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 更改jdk版本: 使用插件 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<!-- pluginManagement按需加载 -->
<pluginManagement>
<plugins>
<!--添加Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8888</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</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.zl</groupId>
<artifactId>test-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 默认的值为../pom.xml :表示父类的pom.xml的路径 如果relativePath找不到父项目的pom.xml,从本地仓库找
如果本地仓库,找不到,报错 开发阶段,推荐些写relativePath -->
<relativePath>../user-parent/pom.xml</relativePath>
</parent>
<!-- 基础父类,地址不变,只需要填写名字 -->
<artifactId>test-common</artifactId>
<!-- entity没有需要导入的jar包不需要引入 -->
</project>
在本层中添加需要的依赖
<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.zl</groupId>
<artifactId>book-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>test-mapper</artifactId>
<!-- 添加本层需要的依赖 -->
<dependencies>
<!-- 添加上一层maven项目的依赖的代码
由于继承关系,上一层继承了父类,故本类也继承了test-parent父类 -->
<dependency>
<groupId>com.zl</groupId>
<artifactId>book-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 因为父类中定义了版本号,不需要定义-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
</dependencies>
</project>
maven的聚合
2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,我们期望能够使用简单的操作来完成编译等工作,这时Maven给出了聚合的配置方式。所谓聚合,顾名思义,就是把多个模块或项目聚合到一起。
简单的说:我们在一个项目中会存在模块A和模块B,在各自的项目目录下,我们可以分别通过命令 mvn clean package 来构建各个模块,
但是如果我们想将这两个模块一起构建呢?
答案是我们需要建立一个模块C做为一个聚合模块。
建立一个聚合项目,满足如下几点要求:
- 1.该aggregator本身也做为一个Maven项目,它必须有自己的POM
- 2.它的打包方式必须为: pom
- 3.引入了新的元素:modules---module
- 4.版本:聚合模块的版本和被聚合模块版本一致
- 5.relative path:每个module的值都是一个当前POM的相对目录
- 6.目录名称:为了方便的快速定位内容,模块所处的目录应当与其artifactId一致(Maven约定而不是硬性要求),总之,模块所处的目录必须和<module>模块所处的目录 </module>相一致。
- 7.习惯约定:为了方便构建,通常将聚合模块放在项目目录层的最顶层,其它聚合模块作为子目录存在。这样当我们打开项目的时候,第一个看到的就是聚合模块的POM
- 8.聚合模块减少的内容:聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/Java、src/test/java等目录,因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。
- 9.聚合模块和子模块的目录:他们可以是父子类,也可以是平行结构,当然如果使用平行结构,那么聚合模块的POM也需要做出相应的更改。
注:在现有的实际项目中一个 POM既是聚合POM,又是父 POM,这么做主要是为了方便
使用聚合的好处
将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需要逐个手动进行clean操作。而使用了聚合之后就可以批量进行Maven工程的安装、清理工作。