目录:

1.什么是依赖?

2.依赖的管理:依赖的范围与传递,依赖的排除,依赖的原则(maven对依赖冲突的处理原则)

3.依赖的版本管理

4.继承与聚合

1.什么是依赖?

简单的讲,当jar包A需要jar包B的支持才能正常工作时,那么B就是A的依赖,以spring-core为例,它依赖commons-logging,再比如commons-fileupload,它依赖commons-io

对于软件开发人员来说,手动拷贝jar包时常会碰到依赖关系的问题,特别是搭框架的时候,更是让人头大,不是缺这个就是少那个,因此我们需要一个工具帮助我们管理依赖

关系,最好是我们导入一个jar包时,它可以自动帮我们处理相关的依赖包,maven就解决了这个问题,在maven中添加springcore的依赖,他会自动添加commons-logging

可以看到添加依赖时需要提供依赖坐标,即G(域名倒序+项目名).A(模块名,也可以理解为工程名).V(版本),坐标的查询可以到maven的仓库:

http://mvnrepository.com/(当然,以程序运行的角度来讲.依赖是对jar的引用)

2.依赖的管理

2.1依赖的范围

依赖的范围可以理解为依赖的作用域,即依赖什么时候对什么有效

依赖的范围有4种:compile,test.provided,runtime,重点关注我标红的两个,在<dependency>标签内部有一个<scope>标签

此标签用于定义依赖的范围,其值默认为compile

compile:对主程序以及test程序均有效,参与项目打包(即scope为complie的依赖所指向的jar包会在工程打包时(web工程)导入工程中)

provided:对主程序以及test均有效,不参与打包(如servlet-api.jar,jsp-api.jar这些jar包会在容器中提供)

test:仅对测试程序有效,也不参与打包(了解),

runtime:仅参与打包,提供运行时支持(了解)

2.2关于依赖传递

如果模块A依赖了一些jar包,那么当我们创建模块B时,他需要依赖A,也就是说我们要在B的pom.xml中添加A的依赖(G.A.V)

当我们添加A的依赖完毕后发现A依赖的jar也会被引入,这是对依赖最直接也是最简洁的解释,下面结合依赖范围对依赖的传递

做个简短的说明,可以看到maven003工程依赖maven001工程

在maven001工程中添加的jsp-api.jar的依赖scope为provided,可以看到maven003的依赖毫无变化

修改scope为compile

显然compile范围的依赖会进行传递,而provided范围的不会进行传递(test范围也不进行传递,这里不做演示了)但是当我们实际操作的时候,对于我们一些项目自带的依赖我们不想要或者不想使用

这个版本,这个时候就涉及到依赖的排除与依赖的原则

2.3依赖的排除

使用<exclusions>标签对依赖进行排除(没有V),接着2.2我们把jsp-api.jar的依赖范围设为了compile但是作为maven003来讲,我不想要这个依赖,只需添加如下标签

(ps:也可以在maven001 pom中借助optional标签来进行排除)

2.4依赖的原则(maven对依赖冲突的处理)

依赖的冲突通常都是跨pom文件冲突,对于这种冲突maven有两个原则.

第一个原则是就近原则,现在我们让maven003的直接依赖是maven002.maven002的直接依赖是maven001.换句话说maven003的间接依赖是maven001

如下所示,当log4j包出现冲突时,,maven003c采用了路径最近的maven002的版本

第二个原则是先声明者优先,由于先声明了maven001的依赖,此时可以看到maven003采用了maven001中的log4j依赖版本

当你把顺序调换后会发现,此时maven003采用了maven002的log4j依赖版本

还有一种情况是同一个pom文件中,对同一个依赖使用了两个不同的版本,此时下面的覆盖上面的

3.依赖版本统一管理

jar包版本更迭速度快,如何对一个框架的相关jar进行统一的版本管理?

maven提供了<properties>属性,在其内部自定义标签对版本进行控制,具体使用时在version中使用${}进行取值即可

但是我们看到这只是在一个工程(模块)中实现了版本统一管理,如何在多个工程(模块)下实现版本统一呢?这就需要maven中的继承了

4.继承与聚合

创建一个maven工程Parent,注意把packaging选择为pom,接下来让已创建的的maven工程继承此工程,使用parent标签,添加父工程G.A.V即可

这样就可以实现统一管理多个子工程的通用jar包,上面的图已经包含了聚合的信息

聚合往往伴随着继承一起出现,为了方便多个子工程的"install"操作,使用聚合时需要在<modules>标签

中指定各个模块或者子工程,这样直接在此父工程(聚合工程)上执行install操作,那么所有的子工程都会执行install

操作了,值得一说的是如果你创建的是maven module(maven模块)那么你不需要使用继承就可以直接使用聚合,因为你创建

mavenmodule时已经选择了parent project,这也是为什么生成的module中会有parent标签的原因,

最后几点说明:

1.由于依赖的scope默认是compile,所以依赖默认是传递的

2.以上演示的jsp-api依赖实际开发时要注意把scope设为provided,否则容易引起jar包冲突

3.由上面的第四点可以得出结论:maven module与maven project的区别就是maven module必须有parent工程(现在还不清楚maven是如何对一个工程判断他是module还是projec)

maven 依赖(依赖范围,聚合,继承等)的更多相关文章

  1. 【maven】依赖、继承、聚合

    依赖: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId&g ...

  2. (二)Maven 基本概念——依赖、生命周期、仓库管理、聚合&继承

    1. 依赖配置 1.1 依赖配置主要包含如下元素: <!--添加依赖配置--> <dependencies> <!--项目要使用到junit的jar包,所以在这里添加ju ...

  3. UML的类图关系分为: 关联、聚合/组合、依赖、泛化(继承)

    UML的类图关系分为: 关联.聚合/组合.依赖.泛化(继承).而其中关联又分为双向关联.单向关联.自身关联:下面就让我们一起来看看这些关系究竟是什么,以及它们的区别在哪里. 1.关联 双向关联:C1- ...

  4. 类之间关系理解:组合>聚合>关联>依赖;实现,继承

    类之间关系理解:组合>聚合>关联>依赖:实现,继承 1. 从类之间的关系来看,不外乎以下几种 组合>聚合>关联>依赖:实现,继承 且可以分为以下两类: (1)实现, ...

  5. maven中import scope依赖方式解决单继承问题的理解

    在maven多模块项目中,为了保持模块间依赖的统一,常规做法是在parent model中,使用dependencyManagement预定义所有模块需要用到的dependency(依赖) <d ...

  6. Maven学习(八)继承和聚合

    *聚合(多模块) 在一个项目中 往往有多个模块组成,例如有项目demo下面有a, b两个模块 为了能使用一条命令就能构建demo-a, demo-b两个模块, 需要创建一个额外的聚合模块, 然后通过该 ...

  7. Maven详解之聚合与继承

    说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...

  8. Maven详解 之 聚合与继承

    说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...

  9. (转)Maven学习总结(五)——聚合与继承

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(五)——聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <mod ...

随机推荐

  1. 关于jsonp跨域的问题以及解决方法(跨域、同源与非同源)

    什么是跨域? 想要了解跨域,首先需要了解下浏览器的同源机制: JSONP和AJAX相同,都是客户端向服务器端发送请求:给服务器端传递数据 或者 从服务器端获取数据 的方式 JSONP属于非同源策略(跨 ...

  2. Maven报错Missing artifact jdk.tools:jdk.tools:jar:1.7--转

    原文地址:http://blog.csdn.net/u013281331/article/details/40824707 在Eclipse中检出Maven工程,一直报这个错:“Missing art ...

  3. 如何在vue项目中使用百度编辑器ueditor

    百度编辑器官方并没有提供vue项目使用说明,目前网上也有不少人实现了相关功能,这里就不再重复,只是针对自身项目碰到的情况做个记录,就当是熟悉了一遍富文本编辑器的代码结构. 按照网上的做法,基本可以实现 ...

  4. SoC编译HEX脚本(基于RISC-V的SoC)

    SoC编译HEX脚本(基于RISC-V的SoC) 脚本使用 ./compile hello 脚本:设置RISC-V工具链riscv_set_env ############## RISC-V #### ...

  5. C#实现自己主动升级(附源代码)

           对于PC桌面应用程序而言,自己主动升级功能往往是不可缺少的. 而自己主动升级能够作为一个独立的C/S系统来开发,这样,就能够在不同的桌面应用中进行复用.本文将着重介绍OAUS的相关背景. ...

  6. VC和MATLAB混合开发经验总结

    作者:朱金灿 来源:http://blog.csdn.net/clever101 前期准备: 1.请确认机器中已经安装Matlab主程序或(MCR)MATLAB Compiler Runtime(具体 ...

  7. 同一master,两个slave的server_id相同问题处理

    错误日志报错如下: 2017-09-15 18:45:59 1660 [Note] Slave I/O thread: Failed reading log event, reconnecting t ...

  8. JavaWeb网站技术架构

    JavaWeb网站技术架构总结   题记 工作也有几多年了,无论是身边遇到的还是耳间闻到的,多多少少也积攒了自己的一些经验和思考,当然,博主并没有太多接触高大上的分布式架构实践,相对比较零碎,随时补充 ...

  9. Bash玩转脚本1之自己的脚本安装程序

    Bash之打造自己的脚本安装器 前言 还是理所当然的前言,我一直想找一套管理脚本的"框架",能让自己杂乱的脚本有点规整.无奈眼界尚浅,未能找到. 因此萌生自己写一点优化脚本的工具来 ...

  10. Hadoop1.2.1伪分布模式安装指南 分类: A1_HADOOP 2014-08-17 10:52 1346人阅读 评论(0) 收藏

    一.前置条件 1.操作系统准备 (1)Linux可以用作开发平台及产品平台. (2)win32只可用作开发平台,且需要cygwin的支持. 2.安装jdk 1.6或以上 3.安装ssh,并配置免密码登 ...