maven 依赖(依赖范围,聚合,继承等)
目录:
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 依赖(依赖范围,聚合,继承等)的更多相关文章
- 【maven】依赖、继承、聚合
依赖: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId&g ...
- (二)Maven 基本概念——依赖、生命周期、仓库管理、聚合&继承
1. 依赖配置 1.1 依赖配置主要包含如下元素: <!--添加依赖配置--> <dependencies> <!--项目要使用到junit的jar包,所以在这里添加ju ...
- UML的类图关系分为: 关联、聚合/组合、依赖、泛化(继承)
UML的类图关系分为: 关联.聚合/组合.依赖.泛化(继承).而其中关联又分为双向关联.单向关联.自身关联:下面就让我们一起来看看这些关系究竟是什么,以及它们的区别在哪里. 1.关联 双向关联:C1- ...
- 类之间关系理解:组合>聚合>关联>依赖;实现,继承
类之间关系理解:组合>聚合>关联>依赖:实现,继承 1. 从类之间的关系来看,不外乎以下几种 组合>聚合>关联>依赖:实现,继承 且可以分为以下两类: (1)实现, ...
- maven中import scope依赖方式解决单继承问题的理解
在maven多模块项目中,为了保持模块间依赖的统一,常规做法是在parent model中,使用dependencyManagement预定义所有模块需要用到的dependency(依赖) <d ...
- Maven学习(八)继承和聚合
*聚合(多模块) 在一个项目中 往往有多个模块组成,例如有项目demo下面有a, b两个模块 为了能使用一条命令就能构建demo-a, demo-b两个模块, 需要创建一个额外的聚合模块, 然后通过该 ...
- Maven详解之聚合与继承
说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...
- Maven详解 之 聚合与继承
说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...
- (转)Maven学习总结(五)——聚合与继承
孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(五)——聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <mod ...
随机推荐
- angular6添加material-svgIcon
1. app/assets/util/util.svg.ts 统一管理svg字体库,避免各个模块分散加载.所以使用公共文件统一处理 再到core.module.ts中引入.在core模块下的所有组价都 ...
- POJ 1862 Stripies 贪心+优先队列
http://poj.org/problem?id=1862 题目大意: 有一种生物能两两合并,合并之前的重量分别为m1和m2,合并之后变为2*sqrt(m1*m2),现在给定n个这样的生物,求合并成 ...
- springboot 使用FreeMarker模板(转)
在spring boot中使用FreeMarker模板非常简单方便,只需要简单几步就行: 1.引入依赖: <dependency> <groupId>org.springfra ...
- ganglia错误解决
1. 运行: 解决: 这时重新启动gmetad,输入命令: service gmetad stop 显示: Shutting down GANGLIA gmetad: ...
- Storm新特性之Flux
Storm新特性之Flux Flux是Storm版本号0.10.0中的新组件,主要目的是为了方便拓扑的开发与部署.原先在开发Storm拓扑的时候整个拓扑的结构都是硬编码写在代码中的,当要对其进行改动时 ...
- Python代码优化及技巧笔记(一)
前言 这里是记录一些本人在开发过程中遇到的一些细节问题.与君共勉. 版权说明 著作权归作者全部.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Coding-Naga链接:http://bl ...
- python画最最简单的折线图
# encoding=utf-8import matplotlib.pyplot as pltfrom pylab import * #支持中文mpl.rcParams['font.sans-seri ...
- 10进制TO16进制
string DecToHex(int Dec_Num){ int num; string str_num; num = Dec_Num; while(num / 16 != 0) { int a = ...
- 【29.27%】【hdu 5908】Abelian Period
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others) 问题描述 设SS是一个数字串,定义 ...
- Linux下kill进程脚本
Linux下kill进程脚本 在Linux有时会遇到需要kill同一个程序的进程,然而这个程序有多个进程,一一列举很是繁琐,使用按名字检索,统一kill Perl脚本 使用方法 kill_all.pl ...