maven聚合与继承
前言
我们的项目呢,有一个itoo-root.itoo-root第一个特殊的地方为packaging,值必须为pom,同时配上了私服的地址
聚合和继承
一张图来看清itoo的情况吧:
目前所有的java项目全都继承了itoo-root,所以itoo-root和itoo-parent是继承关系. itoo-root里面就是定义的所有的jar以及jar的版本,一处声明,多处使用.
看itoo-root使用
<groupId>com.dmsdbj.itoo</groupId>
<artifactId>itoo-root</artifactId>
<version>1.0.2-SNAPSHOT</version>
<packaging>pom</packaging>
<modelVersion>4.0.0</modelVersion>
<!-- 自定义Maven属性会被继承 -->
<properties>
<!-- 私服器地址 -->
<nexus.url>http://ip:8081/nexus/content/repositories</nexus.url>
<!-- 构建项目时必须配置,用于maven中的文件拷贝 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<mysql.version>5.1.45</mysql.version>
<!-- 数据库连接池 -->
<mybatis.version>3.4.5</mybatis.version>
<mybatis-generator-core.version>1.3.2</mybatis-generator-core.version>
</properties>
<dependencyManagement> <!-- 用于父项目配置共同的依赖关系 -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
groupId 和version 是可以被继承的.还有一些可继承:
groupId:项目组id,项目坐标的核心元素
version:版本,项目坐标的核心元素
description:项目的描述信息
organization:项目的组织信息
dependencies:项目的依赖配置
dependencyManagement:项目的依赖管理配置
等等
dependencyManagement: 元素即可让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性.所以这也就是谁用就取.不会有多余的jar存在.
讲完itoo-root,我们来看看itoo-parent是如何来继承的
itoo-parent即继承了itoo-root,同时也是一个聚合工程
先说继承:parent元素是声明父模块,parent下的子元素groupid/artifactId和version指定了父模块的坐标.这三个元素是必须的.
relativePath:由于我们直接把itoo-root推到了私服上,所以直接去本地仓库找就好了.不需要设定了.
(relativePath 默认值是../pom.xml,父pom在上一层目录下.如果找不到,会去本地仓库找)
子模块隐式地从父模块继承了groupId和version.如果遇到子模块需要使用和父模块不一样的groupId和version的情况,用户可以完全在子模块中显式声明.对于artifactId,子模块应该显式声明,因为如果完全继承了父模块,会造成坐标冲突,另外使用了不同的groupId和version,同样的artifactId容易造成混淆.
我们来看看itoo-parent
<parent>
<groupId>com.dmsdbj.itoo</groupId>
<artifactId>itoo-root</artifactId>
<version>1.0.2-SNAPSHOT</version>
</parent>
<groupId>com.dmsdbj.itoo</groupId>
<artifactId>itoo-parent</artifactId>
<version>1.0.3-SNAPSHOT</version>
<packaging>pom</packaging>
<modelVersion>4.0.0</modelVersion>
itoo-parent作为聚合pom
<modules>
<module>achievement-parent</module>
<module>authorityManagement-parent</module>
<module>basicInfo-parent</module>
<module>examinationEvaluation-parent</module>
<module>itooCloud-parent</module>
<module>shiro-jwt-authority</module>
<module>singleTableMaintain-parent</module>
<module>teachingManagement-parent</module>
<module>tutor-parent</module>
</modules>
聚合和继承的关系
对于聚合模块来说:它直到有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在,我们来看itoo-parent, 在其pom中,我们可以看到被聚合的模块,有很多个,但是这些模块之间,并不知道被聚合了.
对于继承关系的父pom来说:它不知道有哪些子模块继承于它,但那些字模块都必须直到自己的父pom是什么. 我们来看itoo-root, 它并不知道有多少个项目在继承它. 但是对于itoo-parent或者graduate-parent来讲,pom也需要配置itoo-root.所以必须得知道父pom是谁.
我们继续看上面的导图,可能你要问了,itoo-parent现在既是聚合pom,也是父pom,这么做主要就是为了方便,融合使用,也没啥问题.