maven常见概念总结

1. maven中依赖范围

首先需要知道,maven在编译项目主代码的时候需要使用一一套classpath。其次,maven在编译和执行测试的时候会使用另外一套classpath。运行项目又会使用另一套classpath。
依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系。maven有以下几种依赖范围:

  • compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用次依赖范围,对于编译、测试和运行三种classpath都有效。典型的例子就是spring-core,在编译、测试和运行的时候都需要使用此依赖。
  • test:测试依赖范围。使用次依赖范围只对测试classpath有效,在编译主代码或者运行项目时无法使用此类依赖,典型例子:JUnit。
  • provided:已提供依赖范围。使用次依赖范围,对于编译和测试classpath有效。但在运行时无效。典型例子:servlet-api,编译和测试项目的时候都需要该依赖,但是运行项目的时候,由于容器已经提供,就不需要maven重复的引入。
  • runtime:运行时依赖范围,使用此依赖范围,对于测试和运行classpath都是有效,但在编译时无效。典型例子:JDBC驱动,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
  • system:系统依赖范围。该依赖与三种classpath的关系和provided依赖范围完全一致。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该慎用。systemPath元素可以引用环境变量。
  • import(Maven2.0.9及以上):导入依赖范围,该依赖不会对三种classpath产生实际影响。

依赖范围与classpath关系图

依赖范围 编译classpath 测试classpath 运行classpath 例子
compile Y Y Y spring-core
test N Y N JUnit
provided Y Y N serlvet-api
runtime N N Y JDBC驱动实现
system Y Y N 本地的,maven仓库之外的类库文件

2.传递性依赖和依赖范围

最左边一行表示第一直接依赖范围,最上面一行表示第二直接依赖范围,中间交叉单元格则表示传递性依赖范围。

第一依赖范围列 compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

3.依赖调解

maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面,大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递依赖。但是有时候,当传递依赖造成问题时,我们就需要清楚的知道该传递依赖是从哪条依赖路径引入。
maven依赖调解原则:

  • 路径最近者优先。
  • 第一声明者优先

在依赖路劲长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用,顺序最靠前的那个依赖优胜。

4.maven生命周期

maven有三个内置生命周期:清理(clean)、默认(default)和站点(site)。clean生命周期处理项目的清理,default的生命周期处理项目部署,site生命周期处理项目站点文件创建。

  • clean生命周期
事件 描述
预清理(pre-clean) 执行实际项目清理之前所需的流程
清理(clean) 删除以前构建生成的所有文件
清理后处理(post-clean) 执行完成项目清理所需的流程
  • default生命周期
事件 描述
验证(validate) 验证项目正确,所有必要信息可用
初始化(initialize) 初始化构建状态,例如设置属性或创建目录
产生来源(generate-sources) 生成包含在编译中的任何源代码
处理源代码(process-sources) 处理源代码,例如过滤任何值
生成资源(generate-resources) 生成资源文件
流程资源(process-resources) 将资源复制并处理到目标目录中,准备打包。
编译(compile) 编译项目的源代码。
工艺类(process-classes) 从编译后处理生成的文件,例如对Java类进行字节码增强。
生成测试来源(generate-test-sources) 生成包含在编译中的任何测试源代码。
流程测试来源(process-test-sources) 处理测试源代码,例如过滤任何值。
生成测试资源(generate-test-resources) 创建测试资源。
流程测试资源(process-test-resources) 将资源复制并处理到测试目标目录中。
测试编译(test-compile) 将测试源代码编译到测试目标目录中
流程检验类(process-test-classes) 从测试编译中处理生成的文件,例如对Java类进行字节码增强。对于Maven 2.0.5及以上版本。
测试(test) 使用合适的单元测试框架运行测试。这些测试不应该要求代码被打包或部署。
制备包(prepare-package) 在实际包装之前,执行必要的准备包装的操作。这通常会导致打包的处理版本的包。(Maven 2.1及以上)
打包(package) 采取编译的代码,并以其可分发的格式(如JAR)进行打包。
预集成测试(pre-integration-test) 在执行集成测试之前执行所需的操作。这可能涉及诸如设置所需环境等。
集成测试(integration-test) 如果需要,可以将该包过程并部署到可以运行集成测试的环境中。
整合后的测试(post-integration-test) 执行集成测试后执行所需的操作。这可能包括清理环境。
校验(verify) 运行任何检查以验证包装是否有效并符合质量标准。
安装(install) 将软件包安装到本地存储库中,以作为本地其他项目的依赖关系。
部署(deploy) 在集成或发布环境中完成,将最终软件包复制到远程存储库,以与其他开发人员和项目共享。
  • site生命周期
事件 描述
pre-site 项目site生成前处理
site 生成项目site文档
post-site 后处理
site-deploy 将生成的site文档部署到指定的web服务器上
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 一、maven的两个作用 项目自动化构建,通过命令行就可以完成整个项目构建过程,不需要我们手动地进行项目构建 管理...
    lifeline张阅读 834评论 0 1
  • Maven的基本了解 什么是Maven? Maven就是Apache下的一个开源项目。它是用纯java开发的。是一...
    Bcome阅读 2,773评论 0 7
  • 2018年3月20日14点29分 前言 接着上一篇JSON的文章,我又算是系统的学习了一遍Maven吧 之前对Ma...
    天下无敌强阅读 674评论 0 2
  • 需求:lib升级管理不方便,转为maven项目,方便管理。解决方案:maven提倡的是"约定优于配置",而目前项目...
    土豆了解一下阅读 1,516评论 0 0
  • 看到窗外弥漫的大雾,感觉好冷,便为自己不想起床找到了借口,睡到9点多。如果不是想到要给爷爷煮面,我还想继续睡。 起...
    灵明洞彻阅读 114评论 0 0