一、继承

引言

继承关系可以对不同模块的依赖版本做统一管理,因为子模块中的依赖基本都继承于父模块,父模块中指定哪个版本,子模块就继承哪个版本,可以有效避免不同模块可能采用不同版本的依赖时产生的冲突

1. 继承关系的实现

(1)parent 模块设置

parent 模块即父模块,由于父模块只是为了给子模块提供依赖,所以父模块中只需要一个 pom.xml 文件即可。父模块的打包方式必须设置为 pom(默认打包方式是 jar)

    <groupId>com.mzz</groupId>
    <artifactId>parent-maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 设置打包方式为 pom -->
    <packaging>pom</packaging>

只要设置了 packaging 属性为 pom,这个模块就可以作为 parent 模块被继承了

(2)子模块设置

子模块中只要设置了 parent 标签,就可以建立继承关系。

所以继承主要体现在子模块,parent 模块是感受不到继承关系的,也无法从 parent 模块中看出哪些模块继承了自己。

另外继承关系建议以后,如果子模块与父模块处于同一 groupId 下,那么子模块可以不写 groupId

    <!--<groupId>com.mzz</groupId>-->
    <artifactId>project-dao</artifactId>
    <version>1.0-SNAPSHOT</version>
	<parent>
		<!-- parent 模块的坐标与版本 -->
		<groupId>com.mzz</groupId>
		<artifactId>parent-maven</artifactId>
		<version>1.0-SNAPSHOT</version>
		<!-- parent 模块的相对路径 -->
		<relativePath>../parent-maven/pom.xml</relativePath>
	</parent>

对 relativePath 属性做一些补充:

  • relativePath 可以省略,前提是 parent 模块已经 install 至仓库,否则子模块无法定位到 parent,不能通过编译
  • 相对路径最后可以不写 pom.xml,只定位到父模块的文件夹也可以

2. 依赖配置

(1)必须继承的依赖

parent 模块中声明的依赖便是子模块必须继承的依赖,子模块中不必声明便从父模块中继承了这些依赖

<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>5.2.20.RELEASE</version>
	</dependency>
	<!-- 省略了其他依赖的声明 -->
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>javax.servlet-api</artifactId>
		<version>4.0.1</version>
		<scope>provided</scope>		<!-- scope 属性也会被继承 -->
	</dependency>
<dependencies>

如上图,可见子模块中未声明依赖就继承了 parent 中的所有依赖

(2)有选择地继承依赖

parent 模块中设置依赖管理 dependencyManagement 后,在其中声明的依赖就是供子模块选择的依赖。子模块需要哪些依赖,必须在子模块中声明依赖,但不需要注明 version,因为版本由 parent 来指定。

<!-- parent 模块 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.10.RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<!-- 子模块声明依赖 -->
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
    </dependency>
</dependencies>

如果子模块声明的依赖有 version 属性,那么这个依赖并不继承自 parent

另外,parent 模块声明在 dependencyManagement 中的依赖并不被 parent 模块所依赖

(3)插件继承

插件的继承规则和设置方法与前面的依赖极为相似,同样也有插件管理 pluginManagement,与 dependencyManagement 类似,这里给出一个 parent 中设置的样例模板

<build>
    <plugins>
		<!-- 声明必须继承的插件 -->
    </plugins>
    <pluginManagement>
        <plugins>
			<!-- 声明可供选择是否继承的插件 -->
        </plugins>
    </pluginManagement>
</build>

二、聚合

引言

聚合就是指将多个模块组织成一个整体,同时进行项目的构建工作。

使用聚合可以避免分模块开发时的一些问题,比如某个模块更新了一些内容,但其它已经构建好的模块不会进行更新,将所有模块聚合之后,只对聚合模块进行构建就会对所有模块都进行构建,能够及时的发现问题

实现聚合

聚合模块也被称为 root 模块,同样是一个只需要 pom.xml 文件的项目,只要设置了 modules 标签,再将聚合的模块添加进去,即可实现聚合

<modules>
	<!-- module 属性中写明被聚合模块的相对路径 -->
	<module>../project-pojo</module>
	<module>../project-dao</module>
	<module>../project-service</module>
</modules>

如上例,将 pojo,dao 和 service 三个模块进行了聚合,只要对聚合模块进行构建,这三个模块也会被一起构建

聚合只体现在聚合模块,被聚合的模块也无法感知自身被谁所聚合

三、继承与聚合的合并

继承是的 parent 模块和聚合时的 root 模块都只有 pom.xml,因为他们都是设计型模块,不包含实际的模块内容。事实上,继承与聚合经常被合并在一起使用,父模块(parent)也作为聚合模块(root)使用,只需要在父模块中加入 modules 属性,将子模块聚合即可

这时要说一说继承时说到的 relativePath 属性,前面说 relativePath 属性可以省略,前提是父模块已经构建并 install 至仓库,否则子模块无法构建,但此时父模块同时也聚合了子模块,要构建父模块就又要一起构建子模块,但构建子模块又需要父模块 install 至仓库……陷入了套娃问题

此时构建父模块 maven 会报错: Non-resolvable parent POM for XXX.XXX.XXX Could not find artifact com.mzz:parent-maven:pom:1.0-SNAPSHOT and ‘parent.relativePath’ points at wrong local POM,原因是无法定位 parent 模块

解决方法也很简单,要么老老实实在子模块中 parent 标签中加入 relativePath 属性,使 maven

可以根据相对路径找到父模块,要么,先将父模块中的 modules 注释掉,暂时不做聚合,将父模块 install 之后再取消注释,然后就能一起构建啦

到此这篇关于Maven继承与聚合详解及作用介绍的文章就介绍到这了,更多相关Maven 继承 聚合内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Maven继承与聚合详解及作用介绍的更多相关文章

  1. 一文详解如何用原型链的方式实现JS继承

    JavaScript中,每当创建一个对象,都会给这个对象提供一个内置对象 [[Prototype]] 。这个对象就是原型对象,[[Prototype]] 的层层嵌套就形成了原型链。本文将详细讲解如何用原型链的方式实现一个 JS 继承,感兴趣的可以了解下

  2. maven配置阿里云仓库的实现方法

    本文主要介绍了maven配置阿里云仓库的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. JavaScript 继承详解(一)

    几乎每个开发人员都有面向对象语言(比如C++、C#、Java)的开发经验。 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例。

  4. JavaScript 继承详解(四)

    在本章中,我们将分析Douglas Crockford关于JavaScript继承的一个实现

  5. JavaScript中的原型继承基础学习教程

    这篇文章主要介绍了JavaScript中的原型继承基础学习教程,基于原型prototype的继承是JavaScript中实现面向对象中的继承特性的基本手段,需要的朋友可以参考下

  6. js继承的6种方式详解

    这篇文章主要给大家介绍了关于js继承的6种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. 关于Maven混合配置私有仓库和公共仓库的问题

    这篇文章主要介绍了Maven混合配置私有仓库和公共仓库,通过实例代码详细介绍了私有和公共仓库混合配置的方法,需要的朋友可以参考下

  8. 关于maven:pom文件的使用解析

    这篇文章主要介绍了关于maven:pom文件的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  9. Python面向对象的三大特性封装、继承、多态

    这篇文章介绍了Python面向对象的三大特性封装、继承、多态,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. JavaScript面向对象之Prototypes和继承

    本文翻译自微软的牛人Scott Allen Prototypes and Inheritance in JavaScript ,本文对到底什么是Prototype和为什么通过Prototype能实现继承做了详细的分析和阐述,是理解JS OO 的佳作之一

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部