• 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    
    
    <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.0modelVersion>  
        <groupId>com.atguigu.mavengroupId>
        <artifactId>pro03-maven-parentartifactId>
        <version>1.0-SNAPSHOTversion>
    
        
        <packaging>pompackaging>
        
        
        <name>pro03-maven-parentname>
        
        <url>http://maven.apache.orgurl>
    
        <properties>
            
            <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

    • 创建完子模块工程后发现父工程pom.xml配置文件多了modules和module标签(聚合功能的配置)
    • 子工程的pom.xml配置文件多了parent标签用来指定当前工程的父工程坐标
    • 如果子工程引入依赖的jar包坐标中的groupId或version与父工程一致,那么可以省略groupId或version
    
    <modules>  
    	<module>pro04-maven-modulemodule>
    	<module>pro05-maven-modulemodule>
    	<module>pro06-maven-modulemodule>
    modules>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    
    <parent>
        
        <groupId>com.atguigu.mavengroupId>
        <artifactId>pro03-maven-parentartifactId>
        <version>1.0-SNAPSHOTversion>
    parent>
    
    
    
    
    <artifactId>pro04-maven-moduleartifactId>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    • 被父工程管理的依赖并没有真正被引入到工程,子工程需要使用的依赖还需要手动配置到工程中但依赖信息可以不写版本号
    • 如果子工程配置了依赖的版本号则以当前子工程的版本号为准(就近原则),一般子工程还是遵从父工程统一管理的依赖
    <dependencyManagement>
    	<dependencies>
            
    		<dependency>
    			<groupId>org.springframeworkgroupId>
    			<artifactId>spring-coreartifactId>
    			<version>4.0.0.RELEASEversion>
    		dependency>
    		<dependency>
    			<groupId>org.springframeworkgroupId>
    			<artifactId>spring-beansartifactId>
    			<version>4.0.0.RELEASEversion>
    		dependency>
    		<dependency>
    			<groupId>org.springframeworkgroupId>
    			<artifactId>spring-contextartifactId>
    			<version>4.0.0.RELEASEversion>
    		dependency>
    		<dependency>
    			<groupId>org.springframeworkgroupId>
    			<artifactId>spring-expressionartifactId>
    			<version>4.0.0.RELEASEversion>
    		dependency>
    		<dependency>
    			<groupId>org.springframeworkgroupId>
    			<artifactId>spring-aopartifactId>
    			<version>4.0.0.RELEASEversion>
    		dependency>
    	dependencies>
    dependencyManagement>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

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

    <dependencies>
    	<dependency>
    		<groupId>org.springframeworkgroupId>
    		<artifactId>spring-coreartifactId>
    	dependency>
    	<dependency>
    		<groupId>org.springframeworkgroupId>
    		<artifactId>spring-beansartifactId>
    	dependency>
    	<dependency>
    		<groupId>org.springframeworkgroupId>
    		<artifactId>spring-contextartifactId>
    	dependency>
    	<dependency>
    		<groupId>org.springframeworkgroupId>
    		<artifactId>spring-expressionartifactId>
    	dependency>
    	<dependency>
    		<groupId>org.springframeworkgroupId>
    		<artifactId>spring-aopartifactId>
    	dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

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

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

    
    <properties>
    	<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        
    	<atguigu.spring.version>4.3.6.RELEASEatguigu.spring.version>
    properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-coreartifactId>
                
                <version>${atguigu.spring.version}version>
            dependency>
            
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-beansartifactId>
                
                <version>${atguigu.spring.version}version>
            dependency>
            
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-contextartifactId>
                <version>4.0.0.RELEASEversion>
            dependency>
            
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-expressionartifactId>
                
                <version>${atguigu.spring.version}version>
            dependency>
            
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-aopartifactId>
                
                <version>${atguigu.spring.version}version>
            dependency>
        dependencies>
    dependencyManagement>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    Maven中的聚合

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

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

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

    聚合的作用

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

    • 工程聚合之后可以一键执行Maven命令, 很多构建命令都可以在“总工程”中一键执行,如执行mvn install命令可以一键完成安装
    • 在总工程配置聚合之后,各个模块工程会在总工程中展示一个列表,让项目中的各个模块一目了然
    
    
    <modules>  
        <module>pro04-maven-modulemodule>
        <module>pro05-maven-modulemodule>
        <module>pro06-maven-modulemodule>
    modules>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    使用C#跨PC 远程调用程序并显示UI界面
    【并发编程五】c++进程通信——共享内存(shared memmory)
    如何使用腾讯云web应用防火墙结合API网管提供安全防护?
    《计算机视觉中的多视图几何》笔记(11)
    小DEMO:css制作圆滑梯形按钮
    75 寻找旋转排序数组中的最小值
    MapReduce概述
    JK405R-SOP16录音芯片ic方案的常见问题集锦包含录音长度功耗以及外挂spiflash
    Java各种数据结构的定义(如何写测试用例)
    微信小程序--公共组件使用
  • 原文地址:https://blog.csdn.net/qq_57005976/article/details/133846385