目录:

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. 2017.1-TOP5 Android开源库

    Colorful (Github) Colorful简单实用,通过这个开源库可以通过编码的方式来改变应用的主题,不再需要定义不同的style dependencies { compile 'com.g ...

  2. spring接收对象数组实例

    JS var param= new Array(); var one= new Object; one.id = '1'; one.name= 'simba1'; param.push(one); v ...

  3. 前端项目课程7 banner设计注意事项

    前端项目课程7 banner设计注意事项 一.总结 一句话总结: 1.每个部分的里面的部分可以用相同的名字么,如何修改样式呢? 可以, 用模块名 + 比如上中下(top middle bottom) ...

  4. 再谈ITFriend网站的定位

    在网站开发阶段.内部测试阶段.公开测试阶段,让诸多好友和网友,参与了我们的网站ITFriend的体验和测试.其中,大家非常关心,我们的网站是干什么的.在我们不做任何解释的情况下,有的网站认为ITFri ...

  5. 【习题5-3 UVA-10935】Throwing cards away I

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用STL的queue写 [代码] #include <bits/stdc++.h> using namespace st ...

  6. [Node] Setup an Nginx Proxy for a Node.js App

    Learn how to setup an Nginx proxy server that sits in front of a Node.js app. You can use a proxy to ...

  7. GB2312/ANSI编码转中文字符

    struct GB2312{    unsigned short gb2312code;    CString     ChineseCode;}GB2312ToChinese[] = {{0xA1A ...

  8. BAPC2014 C&amp;&amp;HUNNU11583:Citadel Construction(几何)

    题意: 给出一系列的点,要求寻找最多4个点.使得组成一个面积最大的多边形 思路: 非常显然仅仅有两种情况.要么是三角形,要么是四边形 首先不难想到的是.先要把最外面的点都找出来,事实上就是找凸包 可是 ...

  9. 终端复用工具tmux的使用

    tmux的作用在于终端复用. 1. 在server上启动一个bash.并在里面执行tmux 2. 通过ssh远程登录server,执行tmux attach,就会切换到server上的那个bash中, ...

  10. 【solr基础教程之九】客户端 分类: H4_SOLR/LUCENCE 2014-07-30 15:28 904人阅读 评论(0) 收藏

    一.Java Script 1.由于Solr本身可以返回Json格式的结果,而JavaScript对于处理Json数据具有天然的优势,因此使用JavaScript实现Solr客户端是一个很好的选择. ...