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

news2024/11/19 1:51:43

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.coloradmin.cn/o/1095272.html

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

相关文章

qt-C++基于QWidget的程序模板

qt-C基于QWidget的程序模板 code review! 文章目录 qt-C基于QWidget的程序模板1.文件结构1.widget.h2.widget.cpp3.main.cpp4.mytest.pro5.widget.ui 1.文件结构 1.widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { cl…

03.生成式学习的策略与工具

目录 生成式学习的两种策略生成的物件介绍文句影像语音 策略一&#xff1a;各个击破&#xff08;Autoregressive (AR) model策略二&#xff1a;一次到位&#xff08;Non-autoregressive (NAR) model&#xff09;二者的比较其他策略二合一多次到位 AIGC工具New BingWebGPTWebGPT…

python项目之AI动物识别工具的设计与实现(django)

项目介绍&#xff1a; &#x1f495;&#x1f495;作者&#xff1a;落落 &#x1f495;&#x1f495;个人简介&#xff1a;混迹java圈十余年&#xff0c;擅长Java、小程序、Python等。 &#x1f495;&#x1f495;各类成品java毕设 。javaweb&#xff0c;ssm&#xff0c;spring…

只要掌握Win32应用程序错误的来龙去脉,就没必要惊慌失措

也许你遇到了一个问题&#xff0c;你试图运行的程序已损坏甚至丢失。在这种情况下&#xff0c;Windows将无法正确运行该文件&#xff0c;因此&#xff0c;操作系统将生成一个错误——文件不是有效的32位应用程序或文件不是无效的Win32应用程序。 错误通常是因为可执行文件不是有…

【大作文】【图表】【第一段】

描述主题&#xff1a; how sb do the factors that sb do the intention of

万字解析——区块链hyperledger fabric2.2部署实战教程

导航 一、前言二、hyperledger fabric介绍三、测试网络示例3.1 搭建开发环境3.2 安装示例、二进制和 Docker 镜像3.3 使用Fabric测试网络3.4 使用认证机构建立网络 四、汽车生产应用4.1 搭建开发环境4.2 注册登记等操作使用4.3 智能合约4.4 更新账本 五、商业票据应用5.1 运行网…

Adobe2024 全家桶更新了,PS、Ai、AE、PR应用尽有

Adobe2024 全家桶更新了&#xff0c;包含的PS、Ai、AE、PR......个人学习&#xff0c;专业领域都是必不可少的软件都有&#xff0c;需要的不要错过了。 如果你不知道从哪里安装这些工具&#xff0c;小编为大家带来了破J版资源&#xff0c;附上详细的安装包及安装教程。 Mac软件…

bat一键给windows server 2012 打补丁

流程图 脚本 install.bat 主脚本&#xff0c;整理实现逻辑都在这 ECHO OFF REM 自动判断权限问题&#xff0c;主动获取管理员权限>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if %errorlevel% NEQ 0…

LSTM模型的讲解与运用

实验目的&#xff1a; 循环神经网络(RNN)是一类以序列数据为输入&#xff0c;在序列的演进方向进行循环且所有循环单元按链式连接的神经网络。目前RNN已经广泛应用于语音识别、文本分类等自然语言处理任务中。本实验通过采用循环神经网络的变体长短期记忆网络(LSTM)&#xff0…

解决axios不发起请求的问题

一个很简单axios发起的get请求&#xff0c;但是network就是没有xhr记录&#xff1a; 找了半天也没有找到原因&#xff0c;后来问了chatgpt才找到原因&#xff1a; 请求地址url前面没有const关键字&#xff0c;此时url相当于undefined&#xff0c;而axios在url为undefined时不会…

安装Linux系统对硬件的要求

很多初学者在安装 Linux 系统时&#xff0c;都对自己的电脑配置存在质疑&#xff0c;担心其是否能够满足安装 Linux 的要求。本节就从 CPU、内存、硬盘、显卡等这些方面&#xff0c;详细介绍一下安装 Linux 系统的最低配置。 基于硬件的快速发展以及操作系统核心功能的增加&…

基于QPlainTextEdit带标签行号的文本编辑器

关键代码 CodeEditor.h 文件 #ifndef CODEEDITOR_H #define CODEEDITOR_H#include <QPlainTextEdit> #include <QPaintEvent> #include <QContextMenuEvent> #include <QMouseEvent> #include <QMouseEvent> #include <QPainter> #includ…

Hadoop 配置 Kerberos 认证

1、安装 Kerberos 服务器和客户端 1.1 规划 服务端&#xff1a; bigdata3 客户端&#xff08;Hadoop集群&#xff09;&#xff1a; bigdata0 bigdata1 bigdata2 192.168.50.7 bigdata0.example.com bigdata0 192.168.50.8 bigdata1.example.com bigdata1 192.168.50.9 b…

vue补充继上一篇

组合式API-reactive和ref函数 1.reactive() 作用&#xff1a;接受对象类型数据的参数传入并返回一个响应式的对象 1.从vue包中导入reactive函数 2.在<script setup>中执行reactive函数并传入类型为对象的初始值&#xff0c;并使用变量接受返回值。 2.ref() 作用&am…

如何做好一个管理者

一、管理的目标 管理的目的是效率和效益。管理的核心是人。管理的本质是协调&#xff0c;协调的中心是人。管理的真谛是聚合企业的各类资源&#xff0c;充分运用管理的功能&#xff0c;以最优的投入获得最佳的回报&#xff0c;以实现企业既定目标。 二、管理中的核心 2.1、核…

前馈型BP神经网络

1.感知机和激活函数 感知机&#xff0c;是构成神经网络的基本单位&#xff0c;一个感知机可以接收n个输入X&#xff08;x1,x2,x3…xn)T&#xff08;每个输入&#xff0c;可以理解为一种特征&#xff09;,n个输入对应n个权值W&#xff08;w1,w2,w3…wn),此外还有一个偏置项b&am…

AI换脸之Faceswap技术原理与实践

目录 1.方法介绍 2.相关资料 3.实践记录 ​4.实验结果 1.方法介绍 Faceswap利用深度学习算法和人脸识别技术&#xff0c;可以将一个人的面部表情、眼睛、嘴巴等特征从一张照片或视频中提取出来&#xff0c;并将其与另一个人的面部特征进行匹配。主要应用在图像/视频换脸&am…

GMM模型与EM算法

GMM模型与EM算法 --> 聚类 -> 无监督机器学习[参考] 一、单个高斯分布GM的估计参数 1.1 高斯分布 结果趋近于正态分布 每次弹珠往下走的时候&#xff0c;碰到钉子会随机往左还是往右走&#xff0c;可以观测到多次随机过程结合的 高斯分布的似然函数 X1-XN 全部发生的…