第五章:坐标和依赖

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. OpenID Connect + OAuth2.0

    一.问题的提出 现代应用程序或多或少都是如下这样的架构: 在这种情况下,前端.中间层和后端都需要进行验证和授权来保护资源,所以不能仅仅在业务逻辑层或者服务接口层来实现基础的安全功能.为了解决这样的问题 ...

  2. 新概念英语(1-45)The boss's letter

    新概念英语(1-45)The boss's letter Why can't Pamela type the letter? A:Can you come here a minute, please, ...

  3. WebService(1-1)webservice调用

    参考url : http://www.cnblogs.com/flying607/p/6254045.html 今天用动态创建客户端的方式调用webservice,报了这样一个错: 2017-01-0 ...

  4. MySQL命令(逐步更新ing)

     启动mysql 开启: /etc/init.d/mysqld start关闭: /etc/init.d/mysqld stop重启: /etc/init.d/mysqld restart   查看m ...

  5. Java基础中一些容易被忽视的语法小细节总结

    一:语法细节 1. Java中的命名规则: package:统一使用小写字母 class:首字母大写,使用驼峰标识 method:首字母小写,使用驼峰标识 field:首字母小写,使用驼峰标识 sta ...

  6. html<!DOCTYPE>声明标签

    html<!DOCTYPE>声明标签 <DOCTYPE>声明是html文档的第一行,位于<html>标签之前 <DOCTYPE>声明不是html标签,他 ...

  7. [转]Python多进程并发操作中进程池Pool的应用

    Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...

  8. 自动化运维:使用flask+mysql+highcharts搭建监控平台

    1.前言 本来想做一个比较完善的监控平台,只需要做少许改动就可以直接拿来用,但是在做的过程中发现要实现这个目标所需的工作量太大,而当前的工作中对其需求又不是特别明显.所以就退而求其次,做了一个类似教程 ...

  9. 从零开始系列之vue全家桶(1)安装前期准备nodejs+cnpm+webpack+vue-cli+vue-router

    写在前面: 什么是全家桶? 包含了vue-router(http://router.vuejs.org),vuex(http://vuex.vuejs.org), vue-resource(https ...

  10. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger

    原型链是JS的必备,作为ECMAScript4,原型链也是支持的. 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用. 本文旨在介绍如何使用原型链 ...