maven中强大的scope标签详解

本文目的

  接上一篇maven的版本号version的总结及理解
  当我在封装工具jar包的时候,发现有些依赖,是一定要在工具代码里使用的,比如我做的工具包里使用了spring的方法,那我在工具项目里就需要引用spring-web包。
  但是因为咱们都是spring项目,像这个包肯定将来会在子项目里,比如通过引用了spring-boot-starter-web,自动将spring-web包也带进去了。那这样就会产生了引用冲突。如下图:

   一般这种情况,也不会出什么问题,基本开发工具、编译器,自动会优先引用其中一个。(依赖调解机制,后边会写到这个)
   但是作为一个合格的码农,这种事情尽管问题不大,但是凌乱的引用,违背我严谨的初衷。因此本篇的主角scope就是帮助我们解决这种问题的最佳方法。

正文

1. 什么是scope

   比如下图,看下scope的位置:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version><scope>runtime</scope>
</dependency>

2. scope的概念

  首先,我们一个maven项目依赖生效其实分为三个时期,编译期测试期运行期,即,在编译代码的时候,需要使用一套classpath;test测试的时候使用另一套依赖classpath;而到了项目运行时,又需要另一套依赖classpath

  scope一般称为依赖范围。通过合理的配置,可以控制当前依赖在不同时期编译期测试期运行期生效的关系。

3. scope的分类

   scopecompiletestprovidedruntimesystemimport几种。

  • compile : 称为编译依赖范围。如果引用的依赖没有指定scope,默认会使用该依赖范围。使用此依赖范围,表示对于上边说的编译期测试期运行期三种classpath都有效。
  • test:称为测试依赖范围。只对测试期classpath有效,典型的是JUnit依赖,只需要在编译测试代码(src/test)和运行测试的时候才需要。
  • provided : 已提供依赖范围。对于编译期测试期classpath有效。使用该依赖范围,表示当前依赖将来会默认由引用项目一定引用,就不需要多引用了。本文最开始介绍的那种情况,就可以对工具项目中的spring-web依赖,加上<scope>provided</scope>标签。
  • runtime : 运行时依赖范围。对于测试期运行期classpath有效。
  • system : 系统依赖范围。该依赖和provided依赖范围一样,但是在使用该依赖的时候,需要指定systemPath标签,显示的指定依赖jar的路径。使用此依赖范围,表示的是从本地磁盘上找依赖,不是从maven仓库中解析了。使用此依赖的时候要注意,因为是从自己本地磁盘上找依赖,因此如果多个人在共同开发,比较麻烦,还要拷贝那个依赖jar到对方机器上的相同路径下。因此不建议使用这个依赖范围。
  • import : 导入依赖范围。该依赖对于上边说的三种classpath期都没有作用。该范围的依赖只在dependencyManagement标签才有效。它的作用是将目标pomdependencyManagement标签中的依赖,合并到当前pomdependencyManagement标签内,供引用项目中使用。由于import依赖的特殊性,一般看到import范围时,就会存在<type>pom</type>,即指向打包类型为pom的模块。比如下边这样:
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>1.5.4.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

4. 传递性依赖

  当一个项目引用了mybatis-plus-boot-starter包时,因为它的pom里配置了mybatis-plus依赖,并且声明了compile作用域,因此我引入前者后,同样也会把后者引入到项目中,如下图,这种叫传递性依赖。我通过idea看的项目依赖情况:

  另外,关于mybatis-plus-boot-starterpom,对于mybatis-plus的依赖情况如下:

  即声明了compile,因此对于mybatis-plus-boot-starter来说,因为mybatis-plus声明了compile,因此表示它在mybatis-plus-boot-starter中的编译期测试期运行期三种classpath都有效,而我们项目在引用mybatis-plus-boot-starter时,同样使用的是compile。这样就会让我们项目同时拥有了mybatis-plus
   如果我们修改不同的<scope>值,会看到不同的依赖效果,具体的效果参照《maven实战》里的下图:

   因此,依赖范围scope,不仅控制依赖于三种classpath的关系,还对依赖性传递产生影响。

5. scope的应用场景

  说了这么多的scope范围,一般的开发可能根本不关心,但是如果想更加严谨些,你就需要考虑这些,来保证项目的依赖管理更加规范。
   因为每个公司都有架构师,架构师负责对基础框架的升级改造,而他做的东西,将来都要封装成几个依赖Jar包,放到公司私服,将来供引用项目,直接使用。
   比如约定项目采用springboot + mybatis-plus + lombok + shiro + druid,这些不同的版本,都不应该让各个项目自己来引用,都应该架构师来约定好版本,把基础配置做成几个Jar,将这些相关依赖设置成<scope>compile</scope>(不写默认是compile),这样各个子项目都不需要单独引用这些依赖。
   而对于一些个别包,比如引用项目将来会一定引用的,这样做的依赖jar包,就可以设置成<scope>provided</scope>,比如像最开始说的那个spring-web包。

   下一篇 maven项目的结构为什么是这样的

maven中强大的scope标签详解相关推荐

  1. java foreach标签_Java中Velocity foreach循环标签详解

    Java中Velocity foreach循环标签详解 Java Velocity中foreach循环可以很容易的遍历数组或者集合. 定义 #foreach( $elem in $allElems) ...

  2. Maven中scope标签详解

    概述 scope元素的作用:控制 dependency 元素的使用范围.通俗的讲,就是控制 Jar 包在哪些范围被加载和使用.具体值如下: compile:默认值.表示被依赖项目需要参与当前项目的编译 ...

  3. MyBatis中动态sql语句标签详解

    动态 SQL 通常写在mapper包下面的地址映射配置文件(.xml)中.根据条件的不同, SQL 语句也会随之动态的改变. MyBatis 中,提供了一组标签用于实现动态 SQL. 动态SQL语句标 ...

  4. Maven中父子项目依赖传递详解

    父子项目依赖传递实现方式 首先创建父项目 先创建一个项目example-trains-father. 添加父项目打包方式,直接在URL下面添加,即是<project></projec ...

  5. W3C中meta标签详解

    2019独角兽企业重金招聘Python工程师标准>>> meta是html语言head区的一个辅助性标签.几乎所有的网页里,我们可以看到类似下面这段的html代码: <meta ...

  6. html中的mata标签详解

    总是有很多朋友问我<meta name="author" content"xxxxx"><meta http-equiv="xx&q ...

  7. css中table标签详解(一)

    css中table标签详解(一) 什么是table标签,以及table标签的组成? 不叨叨,直接上代码 <table><tr><td></td>< ...

  8. SEO技巧:Meta标签详解

    网页设计:Meta标签详解 您的个人网站即使做得再精彩,在"浩瀚如海"的网络空间中,也如一叶扁舟不易为人发现,如何推广 个人网站,人们首先想到的方法无外乎以下几种: ●在搜索引擎中 ...

  9. 网页设计:Meta标签详解

    网页设计:Meta标签详解 很多人忽视了HTML标签META的强大功效,一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性,有兴趣吗,谁我来重新认识一下META标签吧! META标签是H ...

最新文章

  1. C与C++中的extern与static、extern C与__cplusplus的作用
  2. c语言字 字符串转换成数组_C语言学习教程之详解C语言中的字符串数组
  3. iOS 数据持久化 NSUserDefault
  4. USA 2008 Presidential Debate
  5. android触摸屏idc,android4.0触摸屏滑鼠模式解决方法-添加idc文件
  6. 如何在恢复模式下启动 Mac?
  7. 阿里巴巴微服务技术实践
  8. 求计算机技术在创新上的应用,计算机技术在企业中的应用
  9. 模式窗口(Window.ShowModalDialogs)中提交不弹出新窗口
  10. java NBA2010,关于一个NBA球队连续夺冠的SQL查询问题,解法很精妙~
  11. 从上到下,一文带你看全所有GNN分类
  12. matlab 画图串联_Matlab串联矩阵函数【horzcat】详细解析
  13. 经典家用游戏机启动画面Top10
  14. 【算法】深度搜索(DFS) 和 广度搜索(BFS)
  15. [解决] 钉钉小程序提示 ‘dd is not defined‘
  16. 一个简单的shell脚本--判断网段主机IP存活情况
  17. Linux LVS 负载均衡群集
  18. 我经历过的那些奇葩用户体验(持续更新中。。。)
  19. python建立复数数组_深入理解NumPy简明教程---数组1
  20. Java项目:基于ssm框架个人博客系统多用户(计算机毕业设计)

热门文章

  1. windows启动项修复
  2. cuteftp nfs cuteftp vmtool fcitx
  3. Raid 6与raid 5的区别
  4. spwm调制深度与正输出正弦波关系
  5. Notepad++更改UI颜色
  6. IDEA配置Vue项目启动器
  7. 【numpy】np.random.shuffle()
  8. java jjcc jjsdjj dd
  9. JVM如何处理StackOverflowError
  10. 华为手机6.0GPS获取不到定位信息