maven依赖的描述
maven的坐标和依赖
坐标和依赖,主要涉及的就是pom文件的头部和<dependencies>标签部分
(1)pom文件的头部
这里头部不是指pom文件的开头<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/maven-v4_0_0.xsd">
这里的头部指的是如下部分:
<groupId>com.hex.web</groupId>
<artifactId>web-model-</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
其中,<groupId>标签表面的是项目名称,一般采用项目的名称作为<groupId>的值;<artifactId>标签是项目底下的一个模块;<version>标签表示的是这个模块的版本,SNAPSHOT译为快照,表示的其实是一个不稳定版本;<packaging>标签表示的是打包的类型,没有这个标签时默认是jar。这个头部表示的即是一个maven项目的坐标。
(2)<dependencies>标签
<dependencies>标签下有多个<dependency>子标签,每一个<dependency>都是这个项目或者模块的依赖,<dependency>标签的子标签如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5.6</version>
</dependency>
每个依赖中都有一个项目的坐标,这个坐标唯一确定了一个项目。有些依赖可能会出现<scope>标签,这个标签表示的是依赖的生效范围,默认全局有效。例如如下标签:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
这个依赖表示,junit只会在项目的测试中有效,其他时候是不会引入这个依赖的。 依赖范围分类如下,
compile:编译依赖范围,这是默认的依赖范围,对编译、测试、运行都有效;
test:测试依赖范围,只对测试classpath有效;
provided:已提供依赖范围,只在编译和测试的时候有效,运行时无效;
runtime:运行时依赖范围,只在测试和运行classpath有效;
system:系统依赖范围,慎用!
import:导入依赖范围,不会对三种classpath产生实际影响。
传递依赖
假设项目A依赖于项目B1和B2,项目B1依赖于项目C1,项目B2依赖于项目C2,那么可以说项目A传递依赖于C1,项目A传递依赖于C2。
(1)传递依赖的范围
例如:如果A在compile范围依赖于B,B在compile范围依赖于C,那么A在compile范围依赖于C
传递依赖的范围由第一直接依赖(A依赖于B)和第二直接依赖(B依赖于C)共同决定。
(2)传递依赖的版本问题
例如:如果A依赖于B1和B2,B1依赖于C1,C1依赖于C(2.0),B2依赖于C(1.0),那么A传递依赖于C,但是C的版本如何确定?
第一原则:路径最短原则,A传递依赖于C的路径长度分别为3和2,按照原则应该选择路径长度为2的C的版本,所以C的版本为1.0
第二原则:最先声明原则,如果路径相同,如上诉例子中,B1依赖于C(2.0),此时C的版本应该由pom文件中最先声明的依赖确定。
(3)排除依赖
例如:A依赖于B,B依赖于C,则A传递依赖于C。但是,当我们不像在项目A中引入C的依赖(传递也不要),那么我们需要在引入依赖B时,排除B中C的依赖。如下,我们在A的pom文件中应该这样写:
<dependency>
<groupId>com.B.project</groupId>
<artifacted>project-b<//artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>com.C.project</groupId>
<artifactId>project-c</artifactId>
<exclusion>
<exclusions>
</dependency>
这样,在引入对B的依赖时,就不会引入对C的依赖。如果我们还不想引入B的依赖D,可以在<exclusions>标签下添加一个<exclusion>标签描述D的坐标。注意:此处的坐标不包含<version>标签,因为B中对C的依赖的版本是唯一的(不唯一时会按照两个原则确定唯一的)
maven依赖的描述的更多相关文章
- Maven依赖解析
本文将记录Maven工程中依赖解析机制,内容包括: Maven依赖基本结构 从仓库解析依赖的机制 依赖传递性解析实例 1. Maven依赖基本结构 上篇文章记录了Maven依赖的聚合与继承,POM中依 ...
- Java开发小技巧(二):自定义Maven依赖
前言 我们在项目开发中经常会将一些通用的类.方法等内容进行打包,打造成我们自己的开发工具包,作为各个项目的依赖来使用. 一般的做法是将项目导出成Jar包,然后在其它项目中将其导入,看起来很轻松,但是存 ...
- Java-Maven-Runoob:Maven 依赖管理
ylbtech-Java-Maven-Runoob:Maven 依赖管理 1.返回顶部 1. Maven 依赖管理 Maven 一个核心的特性就是依赖管理.当我们处理多模块的项目(包含成百上千个模块或 ...
- maven 学习---Maven依赖管理
其中一个Maven的核心特征是依赖管理.管理依赖关系变得困难的任务一旦我们处理多模块项目(包含数百个模块/子项目). Maven提供了一个高程度的控制来管理这样的场景. 传递依赖发现 这是很通常情况下 ...
- maven依赖与传递性依赖
目录 依赖范围 传递性依赖 依赖调节 可选依赖 本文主要是针对<maven实战>书中关键知识点的学习记录,未免有纰漏或描述不到之处,建议购买阅读原书 首先贴出一个pom常见的一些元素释义 ...
- 【第十五篇】- Maven 依赖管理之Spring Cloud直播商城 b2b2c电子商务技术总结
Maven 依赖管理 Maven 一个核心的特性就是依赖管理.当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难.针对此种情形,Maven 提供了 ...
- Maven依赖版本冲突的分析及解决小结
1:前言 做软件开发这几年遇到了许多的问题,也总结了一些问题的解决之道,之后慢慢的再遇到的都是一些重复性的问题了,当然,还有一些自己没有完全弄明白的问题.如果做的事情是重复的,遇到重复性问题的概率也就 ...
- 解决maven依赖传递中的版本冲突问题
通常情况下,我们都比较喜欢使用maven进行项目管理,要加个依赖包也非常简单,不需要到处去下载jar包,当然除了maven之外,也还有一些非常不错的工具.在使用maven进行项目依赖管理的时候,有时候 ...
- 160929、各数据库连接配置与maven依赖安装
最近做的项目都是maven的,据说maven是个东西.把依赖的jar文件的事情都委托出去辣!试着用了一下哈,效果还可以! 今天做了数据库配置这一块,特意把相关的东西总结出来,以备不时之需. MySQL ...
随机推荐
- .NetCore Build Terminology
.NETCore Command: 1.dotnet build 2.dotnet run 3.dotnet new classlib 4.dotnet new xunit 5.dotne ...
- mysql状态分析之show global status(转)
mysql> show global status;可以列出MySQL服务器运行各种状态值,我个人较喜欢的用法是show status like '查询值%';一.慢查询mysql> sh ...
- MATLAB插 值 法
MATLAB插 值 法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一.实验目的 二.实验原理 三.实验程序 四.实验内容 五.解答 1. 程序 ...
- VMware NAT 设置原理
1.网络地址转换(NAT):默认使用VMnet8 (强烈推荐) 这种访问模式指的是虚拟机不占用主机所在局域网的ip,通过使用主机的NAT功能访问局域网和互联网,意味着虚拟机可以访问局域网中的其他电脑, ...
- web机试
测试: <html><style> </style><title>Demo</title> <body><div > ...
- OPENSTACK在RHEL7安装;admin创建虚拟机模板供demo使用
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010026901/article/details/30965601 首先RHEL7安装.导入镜像, ...
- redis命令大全参考手册
redis功能强大,支持数据类型丰富,以下是redis操作命令大全,基本上涵盖了redis所有的命令,并附有解释说明,大家可以收藏.参考,你一定要知道的是:redis的key名要区分大小写,在redi ...
- Qt+QGis二次开发:创建临时图层并添加要素
开发环境:Win10 + VS2010 + Qt 4.8.6 + QGis 2.14.4 其实本文实现的功能类似于QGis中“添加文本数据图层”的一个简化版,本文不会涉及到对话框的使用,不通过与用户互 ...
- springzuul本地路由和跨服务器路由问题
阿里云服务器在旧新服务迁移过程中,发现路由到认证中心找不到服务 解决办法: 在路由配置里面使用下面的配置 #zuul.routes.claimconf.path=/claimconf/**#zuul. ...
- FreeRTOS队列
简单来讲队列是任务间通信的方式,队列本身是可以存储消息的,队列的消息可以由一个或者多个任务写入,也可以由一个或者多个任务读出,总之消息队列是任务间通信方式: