第五章:坐标和依赖

1.每个依赖中可以包含的元素有:

  • groupId,artifactId,version: 这三个元素是Maven项目最重要的元素。Maven需要根据这三个坐标找到需要的依赖。
  • type:依赖的类型,对应所依赖的项目所定义的packaging。一般此元素不必声明,默认为jar
  • scope:依赖范围,后面会详细讲解
  • optional:标记依赖是否可选
  • exclusions:用来排除依赖性传递

2.依赖范围:

需要知道的是:Maven在编译,测试,运行使用的是不同的classpath(编译classpath,测试classpath,运行classpath)

注:这里的classpath和J2EE中的WEB-INI的classpath不是同一个概念。此处的classpath是javac命令编译的时候,-classpath参数

依赖范围是用来控制Maven项目所引入的依赖于这三种classpath的关系。

Maven有一下集中依赖范围:

  • compile(默认):编译依赖范围。此范围对于编译、测试、运行三种classpath都有效
  • test:测试依赖范围。此范围只对于测试classpath有效,典型的例子:JUnit
  • provided:已提供依赖范围。此范围对于编译测试两种classpath有效,典型例子api  (注:第一次看到此范围,一直不明白为什么叫provided范围,后来再次看,理解到有时候项目是在一个容器里面运行的,而这个容器已经提供了项目运行所需要的api。比如:Servlet、jre和jdk的区别一样provided:已提供范围全称应该叫运行时api已经提供的范围。)
  • runtime:运行时依赖。此范围对于测试、运行classpath有效,编译的时候无效。典型例子:JDBC (注:为什么runtime不只是对运行时有效?)
  • system(尽量别用):系统范围依赖。此范围对于编译、测试两种classpath有效。与provided区别:使用system依赖必须通过systemPath元素显式指定依赖文件的路径,由于路径一般是与本机系统绑定的,可能对系统移植带来一定的问题,因此谨慎使用
   <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jir</systemPath>
</dependency>
  • import:导入依赖范围,该依赖范围不会对classpath产生实际影响。后续详细介绍。

依赖范围

对于编译classpath有效 对于测试classpath有效 对于运行时classpath有效 例子

compile

test

provided

runtime

system

Y

-

Y

-

Y

Y

Y

Y

Y

Y

Y

-

-

Y

-

spring-core

JUnit

servlet-api

JDBC驱动

本地的Maven仓库之外的类库文件

3.依赖传递

传统不使用Maven的项目中,往往需要手动的下载相关依赖,但是由于依赖可能又会依赖其他的类库,层层引入,因此可能会引入很多其他的不必要的依赖。

或者是之引入一个简单的依赖,这个依赖不包含其他的依赖,然后根据出错的信息,依次引入其他的依赖,这种方法,更加麻烦。

Maven传递性依赖机制可以很好的解决这一个问题。

看例子:

account-email 引入了一个org.springframework:spring-core:2.5.6依赖,同时spring-core包含了一个commons-logging依赖,对于commons-logging依赖,默认使用的依赖范围为compile,同时对于spring-core,account-email声明的依赖也是compile。

那么commons-logging便成为account-email的传递依赖。

传递依赖和依赖范围:

compile test provided runtime

compile

test

provided

runtime

compile

test

provided

runtime

-

-

-

-

-

-

-(书上是provided,官方为-)

-

runtime

test

provided

runtime

(最左边一列表示第一依赖范围,最上边一行表示第二依赖范围)

想一想为什么要这样设计?

读书笔记-《Maven实战》-2018/4/18的更多相关文章

  1. AngularJS in Action读书笔记6(实战篇)——bug hunting

    这一系列文章感觉写的不好,思维跨度很大,原本是由于与<Angularjs in action>有种相见恨晚而激发要写点读后感之类的文章,但是在翻译或是阐述的时候还是会心有余而力不足,零零总 ...

  2. 学习笔记——Maven实战(四)基于Maven的持续集成实践

    Martin的<持续集成> 相信很多读者和我一样,最早接触到持续集成的概念是来自Martin的著名文章<持续集成>,该文最早发布于2000年9月,之后在2006年进行了一次修订 ...

  3. 学习笔记——Maven实战(六)Gradle,构建工具的未来?

    Maven面临的挑战 软件行业新旧交替的速度之快往往令人咂舌,不用多少时间,你就会发现曾经大红大紫的技术已经成为了昨日黄花,当然,Maven也不会例外.虽然目前它基本上是Java构建的事实标准,但我们 ...

  4. 学习笔记——Maven实战(七)常用Maven插件介绍(上)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的.进一步说,每个任务对应了 ...

  5. 学习笔记——Maven实战(八)常用Maven插件介绍(下)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  6. 学习笔记-[Maven实战]-第三章:Maven使用入门(1)

    说明:[Maven实战]一书还介绍了怎么样手工创建Maven工程,学习这本书是为了能尽快在工作中使用,就忽略了手工建工程的部分 如果想了解这部分的内容,可以自己看看书 开始: 1.新建一个maven工 ...

  7. (一)《Maven实战》读书笔记 —— Maven简介

    第一章:Maven简介 一.何为Maven? Maven这个词可以翻译为"知识的积累",本书将介绍Maven这一跨平台的项目管理工具.作为Apache组织中的一个个颇为成功的开源项 ...

  8. 学习笔记——Maven实战(一)坐标规划

    坐标是什么?为什么要规划? 坐标是Maven最基本的概念,它就像每个构件的身份证号码,有了它我们就可以在数以千万计的构件中定位任何一个我们感兴趣的构件.举个最简单的例子,如果没有坐标,使用JUnit的 ...

  9. 学习笔记——Maven实战(二)POM重构之增还是删

    重构是广大开发者再熟悉不过的技术,在Martin Fowler的<重构——改善既有代码的设计>一书中,其定义为“重构(名词):对软件内部结构的一种调整,目的是在不改变软件之可察行为前提下, ...

  10. 学习笔记——Maven实战(三)多模块项目的POM重构

    重复,还是重复 程序员应该有狗一般的嗅觉,要能嗅到重复这一最常见的坏味道,不管重复披着怎样的外衣,一旦发现,都应该毫不留情地彻底地将其干掉.不要因为POM不是产品代码而纵容重复在这里发酵,例如这样一段 ...

随机推荐

  1. 新手解决jsp页面<%@报错的方法

    昨天菇凉我很崩溃的重装电脑系统(嗯,没错,第一次自己装系统,我可能是一个假的计算机系学生!),但这没难倒天生聪慧的我,都是小case~.这都不是重点,重点来了,当我火速配置好java的开发环境jdk, ...

  2. CentOS 6.5 Tomcat安装及配置

    1.安装jdk,配置jdk环境(此步骤略过) 2.下载安装tomcat 百度网盘链接: https://pan.baidu.com/s/1Ieejo7TQyzRAVPhQft8Phw 密码: dg2v ...

  3. powerdesigner将name的名字赋给comment

    1 PowerDesigner中批量根据对象的name生成comment的脚本 执行方法:Open PDM -- Tools -- Execute Commands -- Run Script Vb ...

  4. oracle11g导出表时会发现少表,空表导不出解决方案。

    一:背景引入 oracle11g用exp命令导出数据库表时,有时会发现只导出了一部分表时而且不会报错,原因是有空表没有进行导出,之前一直没有找到方法于是用最笨的方法重新建这些空表,当然在我们实际当中表 ...

  5. [LeetCode] Smallest Good Base 最小的好基数

    For an integer n, we call k>=2 a good base of n, if all digits of n base k are 1. Now given a str ...

  6. Scriplet的三种代码

    Jsp中注释分为显示注释和隐式注释, 显示注释 -- 可以通过查看源代码看到 <!-- 第一种注释 -->  隐式注释 --  源代码中看不到 <%--jsp注释---%> & ...

  7. 百度API-------热力图

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  8. codevs 1069 关押罪犯

    提交地址:http://codevs.cn/problem/1069/ 1069 关押罪犯 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻 ...

  9. kmp——cogs 1570 乌力波

    1570. [POJ3461]乌力波 ★☆   输入文件:oulipo.in   输出文件:oulipo.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 法国作家乔治 ...

  10. [USACO 08JAN]Telephone Lines

    Description Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone compa ...