高效开发:pom依赖中的scope属性如何写
Posted Java架构师(公众号:毛奇志)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高效开发:pom依赖中的scope属性如何写相关的知识,希望对你有一定的参考价值。
问题
maven项目的pom.xml中,对于每一个 < dependency> 依赖,基本都有 < groupId> < artifactId> < version> 这三个元素非常重要,是不会写错的,但是还有一个 < scope> 元素,一般是缺省的,但是有时候也会写上,它有五种取值,本文解析。
maven生命周期
在Maven中有三套独立的生命周期:
- Clean Lifecycle:在进行真正的构建之前进行一些清理工作
- Default Lifecycle:构建的核心部分,编译、测试、打包、部署
- Site Lifecycle:生成项目报告、生成站点、发布站点
Maven最重要的就是默认的构建生命周期,在这个生命周期中有23个阶段,不过最重要的是以下几个阶段:编译、测试、打包、安装、部署
要注意非常重要的一点是任何一个阶段运行的时候,他前面所有的阶段都会被运行。
Maven生命周期中常用的指令:
mvn compile //让当前项目经历生命周期中的1–>7 阶段 :完成编译主源代码编译
mvn package //让当前项目经历生命周期中的1–>17阶段 :完成打包
mvn install //让当前项目经历生命周期中的1–>22阶段 :完成包安装到本地仓库
mvn deploy //让当前生命经历生命周期中的1–>23阶段 :完成包部署到中心库中
Maven中scope标签详解
Maven一个哲学是约定大于配置(Convention Over Configuration)。所以maven中很多地方都有默认值,scope的默认值是compile。
干货-Scope的分类
如果上面maven的生命周期看不懂没关系,不管是面试还是项目开发,直接记住下面的就好了。
1.compile:默认值,他表示被依赖项目需要参与当前项目的编译,编译范围有效,在编译和打包时都会将依赖存储进去,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去,会随着项目一起发布。
2.test:依赖项目仅仅参与测试相关的工作,在编译和打包时都不会使用这个依赖,也不会随着项目发布。例如:junit
3.runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。在运行时使用,例如JDBC驱动,适用运行和测试阶段
4.provided:打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作。诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突
5.system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径
尾声
pom中的scope标签一共有五个值,其实就是对maven生命周期的描述。第一个,compile 参与编译 + 测试 + 打包发布运行,唯一走完maven整个生命周期的scope;第二个test 既不要前面的编译,也不需要后面的打包发布运行,唯一需要测试;第三个runtime 需要后面的测试打包发布运行,唯一不需要前面的编译,第四个provided 需要前面的编译,需要测试,唯一不需要打包发布运行;第五个system和provided一样,需要前面的编译,需要测试,唯一不需要打包发布运行,但是不从maven仓库下载,而是要从本地取,需要指定systemPath,一般不常用。
注意:编译即源代码编译,测试即运行单元测试代码,打包发布运行就是到生产环境上跑。
以上是关于高效开发:pom依赖中的scope属性如何写的主要内容,如果未能解决你的问题,请参考以下文章