08Maven中的继承和聚合的作用

Maven中的继承

实际开发中对一个比较大型的项目进行了模块拆分 , 一个project下面创建了很多个modul, 每一个module都需要配置自己的依赖信息

  • 开发中使用的同一个框架内的不同jar包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一

传统方式: 在每一个module中各自维护各自的依赖信息, 这样很容易发生出入导致jar包的版本不易统一管理

  • 确定使用框架时项目所需要的jar包组合(或者说依赖信息组合)需要经过长期摸索和反复调试耗费很大精力

Maven工程之间,A(子)工程继承B(父)工程 , 本质上是A工程的pom.xml中的配置继承了B工程中pom.xml的配置

  • 一般在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本
  • 子工程就可以不用指定依赖的版本号 , 但必须往上可以追溯到一个父工程指定了依赖的版本号(不限于直接父工程)
  • 一处修改处处生效 : 在父工程中将依赖信息的版本进行升级, 相应的所有子工程中依赖的版本号也会升级

编写一套符合要求、开发各种功能都能正常工作的依赖组合并不容易, 如果有人总结了成熟的组合方案,那么再开发新项目时就可以使用工程继承的机制

  • 公司级的父工程中管理的就是保留下来的成熟的依赖组合方案,各个新项目、子系统各取所需即可,极大的提高了效率
  • 通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范准确的 jar包, 又能够将以往的经验沉淀下来,节约时间和精力

在这里插入图片描述

依赖版本管理

需求: 在一个工程中需要依赖多个Spring框架的jar包 , 要求工程中所有jar包的版本必须一致

[INFO] +- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO] | \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] +- org.springframework:spring-beans:jar:4.0.0.RELEASE:compile
[INFO] +- org.springframework:spring-context:jar:4.0.0.RELEASE:compile
[INFO] +- org.springframework:spring-expression:jar:4.0.0.RELEASE:compile
[INFO] +- org.springframework:spring-aop:jar:4.0.0.RELEASE:compile
[INFO] | \- aopalliance:aopalliance:jar:1.0:compile

第一步: 创建父工程pro03-maven-parent(工程中不写业务代码), 要修改它的打包方式为pom , 表示它是专门管理其他Maven工程的工程

<?xml version="1.0" encoding="UTF-8"?>
<!--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标签:代表当前pom.xml所采用的标签结构,从Maven2开始就固定是4.0.0--><modelVersion>4.0.0</modelVersion>  <groupId>com.atguigu.maven</groupId><artifactId>pro03-maven-parent</artifactId><version>1.0-SNAPSHOT</version><!--当前工程作为父工程,它要去管理子工程,所以打包方式必须是pom--><packaging>pom</packaging><!--当前工程的名字--><name>pro03-maven-parent</name><!--maven的官网地址--><url>http://maven.apache.org</url><properties><!--工程构建过程中读取源码时使用的字符集--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>

第二步: 创建子模块工程似于IDEA中的module, 需要进入pro03-maven-parent工程的根目录下运行mvn archetype:generate 命令来创建模块工程

  • 创建完子模块工程后发现父工程pom.xml配置文件多了modules和module标签(聚合功能的配置)
  • 子工程的pom.xml配置文件多了parent标签用来指定当前工程的父工程坐标
  • 如果子工程引入依赖的jar包坐标中的groupId或version与父工程一致,那么可以省略groupId或version
<!--总工程中聚合的配置-->
<modules>  <module>pro04-maven-module</module><module>pro05-maven-module</module><module>pro06-maven-module</module>
</modules>
<!--使用parent标签指定当前工程的父工程-->
<parent><!--通过指定父工程的坐标找到父工程 --><groupId>com.atguigu.maven</groupId><artifactId>pro03-maven-parent</artifactId><version>1.0-SNAPSHOT</version>
</parent><!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略它-->
<!-- <groupId>com.atguigu.maven</groupId> -->
<!-- <version>1.0-SNAPSHOT</version> -->
<artifactId>pro04-maven-module</artifactId>

第三步: 在父工程中使用dependencyManagement标签对依赖的版本号进行统一管理

  • 被父工程管理的依赖并没有真正被引入到工程,子工程需要使用的依赖还需要手动配置到工程中但依赖信息可以不写版本号
  • 如果子工程配置了依赖的版本号则以当前子工程的版本号为准(就近原则),一般子工程还是遵从父工程统一管理的依赖
<dependencyManagement><dependencies><!--父工程管理的依赖并没有真正被引入到工程--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.0.0.RELEASE</version></dependency></dependencies>
</dependencyManagement>

第四步: 子工程中引用那些被父工程管理的依赖可以省略版本号, 表示子工程中这个依赖的版本由父工程的dependencyManagement决定

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency>
</dependencies>

在父工程中声明自定义属性

在父工程的properties标签内创建自定义属性标签用来统一指定依赖的版本,标签名即属性名,标签值即属性值

<!--自定义属性标签-->
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!--创建自定义的属性标签--><atguigu.spring.version>4.3.6.RELEASE</atguigu.spring.version>
</properties>

通过${属性名}引用属性表达式的方式设定依赖的版本号, 这样所有的版本号就成了一个动态值,只有修改标签属性值相应的引用属性值的地方都会修改

<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><!--引用自定义的属性名--><version>${atguigu.spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><!--引用自定义的属性名--><version>${atguigu.spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><!--引用自定义的属性名--><version>${atguigu.spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><!--引用自定义的属性名--><version>${atguigu.spring.version}</version></dependency></dependencies>
</dependencyManagement>

Maven中的聚合

模块部分组成项目整体: 使用一个“总工程”将各个“模块工程”汇集起来,作为一个整体对应完整的项目

  • 从继承关系角度来看:父工程和子工程
  • 从聚合关系角度来看:总工程和模块工程

依赖循环: 如果A工程依赖B工程,B 程依赖C工程,C工程又反过来依赖A工程,那么在执行构建操作时会出现循环引用的错误

聚合的作用

Maven执行命令时要求有父工程时先安装父工程 , 有依赖的工程时,先安装被依赖的工程 , 工程聚合后执行命令时会自动按照正确的顺序执行

  • 工程聚合之后可以一键执行Maven命令, 很多构建命令都可以在“总工程”中一键执行,如执行mvn install命令可以一键完成安装
  • 在总工程配置聚合之后,各个模块工程会在总工程中展示一个列表,让项目中的各个模块一目了然
<!--在总工程/父工程pro03-maven-module中配置modules-->
<!--假设04依赖05,05依赖06(注意依赖循环问题),执行mvn install命令时安装顺序是03,06,05,04---->
<modules>  <module>pro04-maven-module</module><module>pro05-maven-module</module><module>pro06-maven-module</module>
</modules>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人硬件在环仿真:解决实体开发与测试挑战,提升效率与安全性

工业机器人具备出色的灵活性和运动能力&#xff0c;广泛应用于工业制造领域。它们可以完成装配、焊接、喷涂、搬运、加工、品质检测等任务&#xff0c;提高了生产效率&#xff0c;保证了产品质量。此外&#xff0c;在医疗领域也有辅助手术等特殊应用&#xff0c;展现了其在多个…

Flash-Attention

这是一篇硬核的优化Transformer的工作。众所周知&#xff0c;Transformer模型的计算量和储存复杂度是 O ( N 2 ) O(N^2) O(N2) 。尽管先前有了大量的优化工作&#xff0c;比如LongFormer、Sparse Transformer、Reformer等等&#xff0c;一定程度上减轻了Transformer的资源消耗…

k8s-10 cni 网络

k8s通过CNI接口接入其他网络插件来实现网络通讯。目前比较流行的插件有flannel,calico等。 CNI插件存放位置: # cat /etc/cni/net.d/10-flannel.conflist 插件使用的解决方案如下: 虚拟网桥&#xff0c;虚拟网卡&#xff0c;多个容器共用一个虚拟网卡进行通信。多路复用: Mac…

MAC上设置IDEA如何一个窗口打开多个项目,多个tab

1、IDEA一个窗口打开多个项目 如果你打开了多个项目、每次切换都要半天&#xff0c;想让项目都汇聚到top栏 点击 Window - Merge All Project Windows 即可 但是这样比较挫&#xff0c;每次打开新的项目都还是会重新打开一个IDEA窗口 so&#xff0c;如何设置项目在同一个窗口…

【Eclipse】安装教程

首先打开官网&#xff1a;Eclipse Downloads | The Eclipse Foundation 选择download package 如图所示&#xff0c;到如下界面 1.绿色版免安装版本 按图片点击&#xff0c;即可开始下载 2.安装版本 点击Eclipse Installer 依旧选择其他镜像&#xff0c;开头带China的 等待…

Vue3 + Nodejs 实战 ,文件上传项目--实现拖拽上传

目录 1.拖拽上传的剖析 input的file默认拖动 让其他的盒子成为拖拽对象 2.处理文件的上传 处理数据 上传文件的函数 兼顾点击事件 渲染已处理过的文件 测试效果 3.总结 博客主页&#xff1a;専心_前端,javascript,mysql-CSDN博客 系列专栏&#xff1a;vue3nodejs 实战-…

通过代码MyBatis-plus实现对表中createTime和updateTime进行自动更新

通过代码MyBatis-plus实现对表中createTime和updateTime进行自动更新 实现这样的效果可以在数据库中设置&#xff0c;但是我们一般建议在代码里实现&#xff0c; 但是总不能每次insert和update的时候都手写new当前时间 因此推荐使用mybatis-plus 1导入依赖 <dependency&g…

Android Framework通信:Handler

文章目录 前言一、Handler源码分析1、创建Handler2、发送消息3、取消息4、消息处理5、线程切换的方法&#xff08;Handler异步消息处理机制流程&#xff09;handler.sendMessage()handler.post()View.post()Activity中的runOnUiThread() 二、Handler高频面试题1、为什么要有Han…

MySQL为什么用b+树

索引是一种数据结构&#xff0c;用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量&#xff0c;数据量大了索引才显得有意义&#xff0c;如果我想要在[1,2,3,4]中找到4这个数据&#xff0c;直接对全数据检索也很快&am…

Spring framework Day15:@lmport注解使用

前言 在编程中&#xff0c;import注解通常用于导入外部的类、接口或其他资源&#xff0c;以便在当前代码文件中使用。它可以提供一种简洁、方便的方式来引入外部依赖&#xff0c;并且有以下几个主要的应用场景和好处&#xff1a; 引入外部类/接口&#xff1a;使用import注解可…

1.14.C++项目:仿muduo库实现并发服务器之Util模块的设计

一、Util模块 二、实现思想 &#xff08;一&#xff09;管理 实现一些工具接口读取文件内容向文件写入内容URL编码URL解码通过HTTP状态码获取描述信息通过文件后缀名获取mime判断一个文件是不是目录判断一个文件是否是一个普通文件HTTP资源路径有效性判断 &#xff08;二&am…

性能测试需求分析

1、客户方提出 客户方能提出明确的性能需求&#xff0c;说明对方很重视性能测试&#xff0c;这样的企业一般是金融、电信、银行、医疗器械等&#xff1b;他们一般对系统的性能要求非常高&#xff0c;对性能也非常了解。提出需求也比较明确。 曾经有一个银行项目&#xff0c;已经…

DetailView/货币详情页 的实现

1. 创建货币详情数据模型类 CoinDetailModel.swift import Foundation// JSON Data /*URL:https://api.coingecko.com/api/v3/coins/bitcoin?localizationfalse&tickersfalse&market_datafalse&community_datafalse&developer_datafalse&sparklinefalseR…

linux放开8080端口

linux放开8080端口 输入命令&#xff1a; 查看8080端口是否开放 firewall-cmd --query-port8080/tcpno显示端口未打开&#xff0c;yes表示开启&#xff0c;linux开启防火墙默认关闭8080端口 这里是引用&#xff1a;https://blog.csdn.net/weixin_54067866/article/details/1…

Excel 从网站获取表格

文章目录 导入网站数据导入股票实时行情 用 Excel 获取网站数据的缺点&#xff1a;只能获取表格类的数据&#xff0c;不能获取非结构化的数据。 导入网站数据 转到地址之后&#xff1a; 实测该功能经常导致 Excel 卡死。 导入股票实时行情

机器学习的原理是什么?

训过小狗没? 没训过的话总见过吧? 你要能理解怎么训狗&#xff0c;就能非常轻易的理解机器学习的原理. 比如你想教小狗学习动作“坐下”一开始小狗根本不知道你在说什么。但是如果你每次都说坐下”然后帮助它坐下&#xff0c;并给它一块小零食作为奖励&#xff0c;经过多次…

Docker在边缘计算中的崭露头角:探索容器技术如何驱动边缘计算的新浪潮

文章目录 第一部分&#xff1a;边缘计算和Docker容器边缘计算的定义Docker容器的崭露头角1. 可移植性2. 资源隔离3. 自动化部署和伸缩 第二部分&#xff1a;应用案例1. 边缘分析2. 工业自动化3. 远程办公 第三部分&#xff1a;挑战和解决方案1. 网络延迟2. 安全性3. 管理和部署…

边端小场景音视频流分发架构

备注&#xff1a;绿色线条&#xff0c;红色线条&#xff0c;蓝色线条&#xff0c;均是表示同一路流的不同的协议而已 1&#xff09;IPC本身的流媒体的能力有限&#xff0c;一般IPC支持的客户端数10~50个&#xff0c;媒体分发能力&#xff1a;10~20路&#xff0c;看设备品牌能力…

Android---DVM以及ART对JVM进行优化

Dalvik Dalvik 是 Google 公司自己设计用于 Android 平台的 Java 虚拟机&#xff0c;Android 工程师编写的 Java 或者 Kotlin 代码最终都是在这台虚拟机中被执行的。在 Android 5.0 之前叫作 DVM&#xff0c;5.0 之后改为 ART&#xff08;Android Runtime&#xff09;。在整个…

UGUI交互组件ScrollBar

一.ScrollBar的结构 对象说明Scrollbar挂有Image和Scrollbar组件的主体对象Sliding Area表示滑动范围Handle滑块 二.Scrollbar的属性 属性说明Handle Rect控制柄对象的引用Direction拖动控制柄时滚动条值增加的方向Value滚动条的当前值&#xff0c;范围为 0.0 到 1.0Suze控制柄…