(一) 依赖配置声明

包含以下的一些元素:

 <project>
...
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>..</version>
<!-- 依赖的类型,不写就默认为jar -->
<type>...</type>
<!-- 依赖的范围 -->
<scope>...</scope>
<!-- 标记依赖是否可选 -->
<optional>...</optional>
<!-- 用来排除传递性依赖 -->
<exclusions>
<exclusion>
...
</exclusion>
...
</exclusions>
</dependency>
...
</dependencies>
</project>

举个栗子:

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

(二) 依赖范围

表: 依赖范围与classpath的关系

依赖范围

(Scope)

对于编译
classpath有效
对于测试
classpath有效

对于运行时

classpath有效

例子
compile Y Y Y spring-core
test -  Y - JUnit
provided Y Y - servlet-api
runtime -  Y  Y  JDBC驱动实现
system  Y Y  -  本地的,Maven仓库
之外的类库文件

 compile编译依赖范围

【不指定就默认使用此依赖范围】,使用此依赖,对于编译,测试,运行三种classpath都有效;

test 测试依赖范围

表示该依赖只对测试有效,
换句话说,测试代码中的import JUnit代码是没有问题的。
但在主代码中用import JUnit,编译不会通过 。
依赖范围默认为compile,表示该依赖对主代码和测试代码都有效。

一个典型的单元测试包含了三个步骤:

1 准备测试类及数据;

2 执行要测试的行为;

3 检查结果。

测试用例编写完毕之后,就可以调用mave执行测试,在项目根目录下运行:mvn clean test

provided 已提供依赖范围

【对于编译和测试classpath有效,在运行时无效】

(三) 依赖调解

项目A有这样的依赖关系:A -> B -> C -> X(1.0) , A -> D -> X(2.0)

X是A的传递性依赖,但是两条依赖路径上有两个版本的X,那么哪个X会被Maven解析使用呢?

两个版本都解析是不对的,因为那会造成依赖重复,因此必须选择一个。

maven依赖调解的第一原则是:路径最近者优先。该例子中X(1.0)的路径长度为3,而X(2.0)的路径长度为2,因此X(2.0)会被解析使用。

但是,比如这样的依赖关系:A -> B  -> Y(1.0) , A -> C -> Y(2.0) ,

Y(1.0)和Y(2.0)的依赖路径长度是一样的,都为2。

maven依赖的第二原则是:第一声明者优先(在Maven2.0.9版本之后)

如果B的依赖声明在C之前,那么Y(1.0)就会被解析使用。

 

maven实战(03)_依赖的更多相关文章

  1. maven实战(01)_搭建开发环境

    一 下载maven 在maven官网上可下载maven:http://maven.apache.org/download.cgi 下载好后,解压.我的解压到了:D:\maven\apache-mave ...

  2. 【Maven实战】传递性依赖的问题

    在上一篇文章中我们已经介绍了依赖性,这次我们再来介绍下传递依赖的问题,首先我们还是在上篇文章基础之上进行编写. 1.上篇文章中已经建立了一个user-core的模块,现在首先再建立一个user-log ...

  3. maven实战(04)_在pom中使用properties

    使用常量不仅让代码变得简洁,更重要的是可以避免重复,在需要更改的时候,只需要修改一处,降低了错误发生的概率. <project> <modelVersion>4.0.0< ...

  4. maven实战(02)_坐标详解

    (一)  何为mave坐标 maven的世界中拥有数量非常巨大的构件,也就是平时用的一些jar,war等文件. maven定义了这样一组规则: 世界上任何一个构件都可以使用Maven坐标唯一标志,ma ...

  5. Maven实战错误笔记:使用mvn archetype:generate报错:Unable to add module to the current project as it is not of packaging type 'pom'

    在使用mvn archetype:generate生成Maven实战03:HelloWorld中的HelloWorld的项目骨架时报了这个错,从字面上分析是可能与pom.xml文件有关,然后我看了一下 ...

  6. Maven实战(六)依赖

    我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置    依赖可以声明如下: <project> ... <dependenci ...

  7. (转)Maven实战(六)依赖

    我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置    依赖可以声明如下: <project> ... <dependenci ...

  8. Maven实战(十一)eclipse下载依赖jar包出问题

    问题描述 在pom.xml中配置了依赖,但是提示依赖不成功,或在本地仓库找不到相关依赖 大致错误如下: ArtifactDescriptorException: Failed to read arti ...

  9. [Maven实战](9)传递性依赖

    了解Spring的朋友都知道.创建一个Spring Framework项目都须要依赖什么样的Jar包.假设不使用Maven,那么在项目中就须要手动下载相关的依赖.因为Spring Framework又 ...

随机推荐

  1. C#进阶系列——WebApi 异常处理解决方案

    前言:上篇C#进阶系列——WebApi接口传参不再困惑:传参详解介绍了WebApi参数的传递,这篇来看看WebApi里面异常的处理.关于异常处理,作为程序员的我们肯定不陌生,记得在介绍 AOP 的时候 ...

  2. IT培训行业揭秘(二)

    培训机构与高校之间是怎么"勾结"的? 每一个做院招的培训机构通常会有一个“院校关系”部门,这个部门就是专门为培训机构做疏通培训班与高校之间的关系的,通常这个部门都会拥有一张各大高校 ...

  3. QinQ技术浅析

    作者:  |  上传时间:2009-11-16  |  关键字: QinQ技术(也称Stacked VLAN 或Double VLAN)是指将用户私网VLAN标签封装在公网VLAN标签中,使报文带着两 ...

  4. 在 kernel 下打 log。 怪異現象與解決方式。

    code battery_log(BAT_LOG_CRTI, "y t: %d \n", (int)my_timer_timeout); battery_log(BAT_LOG_C ...

  5. bzoj 1500 维修数列

    splay乱搞. 调了两个多小时...这辈子再也不想写splay了... 维护左边最大连续和右边最大连续,维护两个标记,无脑push_down.push_up就行了. 注意最大连续和至少要包含一个数. ...

  6. git简易操作

    git config --global user.name 'scales' git config --global user.email "1477835701@qq.com" ...

  7. TYVJ1035 棋盘覆盖

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 给出一张n*n(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩 ...

  8. oracle--函数--bai

    --1 没有入参的函数.返回字符串 create or replace function get_time return varchar2 as v_time varchar2(20); --声明1个 ...

  9. App.config“配置系统未能初始化” 异常解决 C#

    System.Configuration.ConfigurationManager.AppSettings["user"]; 时出现“配置系统未能初始化” 错误 解决办法: 如果配 ...

  10. 如何在latex 中插入EPS格式图片

    如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...