【精华】maven 生命周期 + 依赖传递+ scope【依赖范围】 + 排除依赖 可选依赖

目录

一 .   lifecycle 生命周期 

二.   依赖 与 依赖传递

三.   scope 依赖范围

scope指定依赖范围

依赖传递依赖与原依赖冲突

四   maven的可选依赖与排除依赖

可选依赖   全部 

排除依赖  显式的指定

maven官网技术文档:


 .   lifecycle 生命周期 

* clean:  清理项目的包
* validate:验证工程是否正确,所有需要的资源是否可用。
* compile: 编译 项目的源代码。
* test:  使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
* package:把已编译的代码 打包成可发布的格式,比如 jar、war 等。
(* integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。)
* verify: 运行所有检查,验证包是否有效且达到质量标准。
* install: 把包 安装 到maven 本地仓库,可以被其他工程作为依赖来使用。
* site:  生成站点文档(报告)等。
* deploy:发布。在集成或者发布环境下执行,将最终版本的包拷到 远程repository,使得其他工程或开发者可共享

二.   依赖 与 依赖传递

1 间接引入的依赖.  又叫 依赖传递依赖【因为 maven的 依赖  具有传递性! ]
       当我们引入了一个依赖的时候,就会自动引入该依赖引入的所有依赖,依次往下引入所有依赖。比如我们引入了Druid数据库连接池的SpringBoot-Starter,就自动引入了该依赖依赖的依赖。总而言之就是套娃就完事了。
 我们将这种依赖称为 间接引入的依赖.
2 直接依赖。
        在pom文件中,直接用<dependency>标签中引入的依赖称为 直接依赖
  • 如果 直接依赖 和 间接引入的依赖 重复了并且版本不一样的话会怎么办呢?
  以显式的 直接依赖为主。
  • 如果 间接引入的依赖冲突了 (比如maven helper里看的 conflict的s),最后引入的到底是哪个版本呢,还是说都会引入呢?
如果是间接引入的(依赖传递的)重复了,遵从以下规则:

 

简单来说,就是越在外层的优先级越高,如果同级的就按照配置顺序,配置顺序靠前的覆盖配置顺序靠后的。

三.   scope 依赖范围

scope指定依赖范围

首先,maven项目 如果不使用插件,依赖都不会被打包。  maven项目的依赖传递全靠pom.xml。
        scope是指依赖范围, 作用于maven的周期。指定 某包的依赖范围。(并限定 那些包  依赖传递 的范围
编译 compile 、 测试 test、 发布后运行 deploy。
  依赖范围   就是用来  控制依赖 和  三种classpath  (编译classpath,测试classpath、运行classpath)的关系,Maven有如下几种依赖范围: 【这里的  运行/打包deploy  和 在idea中 运行主程序main方法  不是一个概念。
  • compile :   【默认】 编译、测试、运行 依赖范围。
        如果没有指定,就会 默认使用该依赖范围。 使用此依赖范围的Maven依赖,对于 编译、测试、运行三种 classpath都有效。典型的例子是spring-code,在编译、测试和运行的时候都需要使用该依赖。
        典型的例子是: log4j。
  • test :     测试依赖范围 。   这个范围是不可传递的。
        表示应用程序的正常使用时不需要依赖项,仅适用于测试编译和执行阶段。使用次依赖范围的Maven依赖,只对于 测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此依赖。典型的例子是Jnuit,它只有在编译测试代码及运行测试的时候才需要。
        典型的例子是: juint。
  • provided只是先编译着,运行时由容器提供编译和测试 。   这个范围是不可传递的。
        使用此依赖范围的Maven依赖,对于 编译和测试 的classpath有效,但在运行时候无效。 表示您期望 JDK 或容器在运行时提供依赖项。
        典型的例子是: servlet-api。 编译和测试项目时需要该依赖,但在运行项目时 由容器提供,不需要重复地import。
  • runtime: 有现成的不编译,在 测试运行时有效。
         表示编译时不需要依赖,但执行时需要依赖。Maven 在 运行时和 测试类路径中包含对此范围的依赖项,但在 编译类路径中不包含此范围。
          典型的例子是: jdbc。

依赖传递依赖与原依赖冲突

        
        如果将 依赖项(横的一行) 设置为左列中的范围,则   该依赖项的 传递依赖项(左竖列) 与顶行的范围会导致主项目中的依赖项具有交叉点列出的范围。如果没有列出范围,则意味着省略了依赖项。
  1.    客(依赖项的传递依赖项)随主(当前依赖项)便   。当前项目指定下,传递依赖项只能取 两者指定范围的 交集(最小项)。
  2.  有冲突时(椭圆区)保持  原则不变。  当 当前依赖项 为runtime时,但  传递依赖项  为provided, 它 不是同样不需要依赖项,反而需要编译 只是运行时由容器提供。所以仍是provided(   依赖项自己不编译;但依赖传递项  编译时需要编译,但运行时由容器提供 == 假设传递依赖项不编译, 只保留依赖传递项的 依赖关系,让容器提供==provided )。
if  简化maven生命周期流程:
     编译(主程序) -> 测试(测试程序) -> (部署)运行, 
取值
适用范围
作用
compile
编译期、测试期、 运行期
       默认 全部生命周期
test
测试期 
       表示正常使用时不需要。用于测试代码的编译和执行,如:junit
provided
编译期、测试期
       表示先编译着,运行时由jdk等容器提供。对于 编译和测试 的classpath有效
runtime
测试期、 运行期
       表示有现成的,不需要编译。测试和运行时需要。
网上说法众说纷纭,需要理解其本质,如下:
注意图中的 这个说法不太对的样子,官网上说明了 runtime包括测试类路径。如下:


四   maven的可选依赖与排除依赖

可选依赖   <optional>全部 

可选依赖指对外隐藏当前所依赖的资源
<dependency>
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
     <optional>true</optional>
</dependency>
配置了该选项之后,junit这个包里的  间接依赖/传递依赖 就失效了。

排除依赖  <exclusion>显式的指定

显式地指定 排除某些依赖项(多用于版本冲突的时候)。
<dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
     <exclusions> 
         <exclusion> 
             <groupId>org.hamcrest</groupId> 
             <artifactId>hamcrest-core</artifactId>
         </exclusion> 
    </exclusions>
</dependency>
配置了该选项之后,指定的间接依赖/传递依赖  hamcrest-core也会失效。
 

maven官网技术文档:

Maven – Introduction to the Dependency Mechanism
Maven——依赖机制介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/41312.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于appium的常用元素定位方法

目录 一、元素定位工具 1.uiautomatorviewer.bat 2.appium检查器 二、常用元素定位方法 1.id定位 2.class_name定位 3.accessibility_id定位 4.android_uiautomator定位 5.xpath定位 三、组合定位 四、父子定位 五、兄弟定位 总结&#xff1a; 一、元素定位工具 app应…

postgresql regular lock常规锁申请与释放 内幕 以及fastpath快速申请优化的取舍

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 定义 每种常规锁都需要定义几个要素&#xff0c;它由结构体 Lo…

边缘检测之loG算子

note // 边缘检测之loG算子&#xff1a;对高斯函数求二阶导数 // G(x,y) exp(-1 * (x*x y*y) / 2 / sigma / sigma) // loG(x,y) ((x*x y*y - 2 * sigma * sigma) / (sigma^4)) * exp(-1 * (x*x y*y) / 2 / sigma /sigma) /* [ 0,0,-1,0,0; 0,-1,-2,-1,0; -1,-2,16,-2…

(栈队列堆) 剑指 Offer 09. 用两个栈实现队列 ——【Leetcode每日一题】

❓ 剑指 Offer 09. 用两个栈实现队列 难度&#xff1a;简单 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead …

Shikra:新一代多模态大语言模型,理解指向,说出坐标

“ Shikra&#xff1a;解锁多模态语言模型参考对话的魔法” Shikra和用户的对话案例 在人类的日常交流中&#xff0c;经常会关注场景中的不同区域或物体&#xff0c;双方都可以通过说话并指向这些区域来进行高效的信息交换。我们将这种对话模式称为参考对话&#xff08;Referen…

C语言 替换gets函数

目录 替换gets函数gets()用处gets()的危险之处gets()的几种替代方法一、用%c循环输入直到遇到换行结束二、用getchar()循环输入直到遇到换行结束三、scanf的另一种用法四、c中的getline()方法五、解决方案使用fgets代替 替换gets函数 gets()用处 gets从标准输入设备读字符串函…

C# Linq 详解四

目录 概述 二十、SelectMany 二十一、Aggregate 二十二、DistinctBy 二十三、Reverse 二十四、SequenceEqual 二十五、Zip 二十六、SkipWhile 二十七、TakeWhile C# Linq 详解一 1.Where 2.Select 3.GroupBy 4.First / FirstOrDefault 5.Last / LastOrDefault C# Li…

truffle 进行智能合约测试

本方法使用了可视化软件Ganache 前两步与不使用可视化工具的步骤是一样的&#xff08;有道云笔记&#xff09;&#xff0c;到第三步的时候需要注意&#xff1a; 在truffle插件下找到networks目录&#xff0c;提前打开Ganache软件 在Ganache中选择连接或者新建&#xff0c;我在…

软件测试测试用例

等价类&#xff1a;把输入的数据可以分为有效的数据和无效的数据 被测试的对象输入的数据&#xff1a; 1、有效的数据 2、无效的数据 测试一个产品&#xff0c;需要考虑它的正确场景&#xff0c;也需要考虑它的异常场景 边界值:边界值测试用例是针对等价类测试用例方法的补…

每天一道C语言编程:排队买票

题目描述 有M个小孩到公园玩&#xff0c;门票是1元。其中N个小孩带的钱为1元&#xff0c;K个小孩带的钱为2元。售票员没有零钱&#xff0c;问这些小孩共有多少种排队方法&#xff0c;使得售票员总能找得开零钱。注意&#xff1a;两个拿一元零钱的小孩&#xff0c;他们的位置互…

Thymeleaf + Layui+快速分页模板(含前后端代码)

发现很多模块写法逻辑太多重复的&#xff0c;因此把分页方法抽取出来记录以下&#xff0c;以后想写分页直接拿来用即可&#xff1a; 1. 首先是queryQrEx.html&#xff1a; <!DOCTYPE html> <html xmlns:th"http://www.w3.org/1999/xhtml"> <head>…

zabbix监控自己

目录 一、实验环境准备 二、server端 1、配置阿里云yum源 2、部署lamp环境 3、启动lamp对应服务 4、准备java环境 5、源码安装zabbix 6、mariadb数据库授权 7、创建zabbix程序用户并授权防止权限报错 8、修改zabbix配置文件 9、配置php与apache 10、web安装zabbix …

Qgis3.16ltr+VS2017二次开发环境搭建(保姆级教程)

1.二次开发环境搭建 下载osgeo4w-setup.exeDownload QGIShttps://www.qgis.org/en/site/forusers/download.html 点击OSGeo4W Network Installer 点击下载 OSGeo4W Installer 运行程序 osgeo4w-setup.exe&#xff0c;出现以下界面&#xff0c;点击下一页。 选中install from i…

uniapp中超好用(且免费)的安全类插件推荐!(持续更新中)

前几天写了一篇【干货分享】uniapp做的安卓App如何加固&#xff0c;发现收藏的人蛮多的。所以说&#xff0c;更加证明了我说的第一个问题&#xff1a;现在用uniapp的人是越来越多了。 而通过使用uniapp上自带的插件&#xff0c;也是能够实现事半功倍的效果&#xff0c;让不懂前…

OpenCv之图像形态学(二)

目录 一、形态学梯度 二、顶帽操作 三、黑帽操作 一、形态学梯度 梯度原图 - 腐蚀腐蚀之后原图边缘变小&#xff0c;原图 - 腐蚀 就可以得到腐蚀掉的部分&#xff0c;即边缘 案例代码如下: import cv2 import numpy as np# 导入图片 img cv2.imread(6.jpg)# 注意调节kern…

ubuntu打开usb摄像头

文章目录 前言一、识别 usb 摄像头二、安装应用程序显示摄像头捕捉到的视频1、使用应用程序茄子&#xff08;cheese&#xff09;2、运行 cheese 捕捉视频 前言 记录一下解决在 Linux 下打开 usb 摄像头界面黑屏的问题。 一、识别 usb 摄像头 1、保持在 ubuntu 界面&#xff0…

leetcode 965.单值二叉树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;单值二叉树 思路&#xff1a; 让当前的根节点与左孩子节点与右孩子节点判断&#xff0c;若相等则继续向下分治&#xff0c;让左孩子与右孩子当作新的根节点继续判断&#xff0c;直到某个节点不相等。 1️⃣ 代码&#x…

相机标定学习笔记

Kalibr 是标定工具中&#xff0c;唯一一个可以标定camToImu的&#xff0c;是vio必不可少的工具&#xff0c;其他的都有替代品。所以学习多种开源算法进行相机标定&#xff0c;并记录学习相机标定的过程。 一、相机标定 1、在场景中放置一个已知的物体 &#xff08;1&#xff…

【DBA课程-笔记】第 3 章:MongoDB数据库核心知识

内容 一、MongoDB 数据库架构 A. MongoDB数据库体系架构 1. 存储引擎&#xff08;MongoDB Storage Engines&#xff09;&#xff1a; 2. MongoDB 数据逻辑架构 二、MongoDB 存储引擎 A. 查看mongodb服务器的状态 B. 查看引擎信息&#xff08;4.2.1 没有这个命令&#xf…

实例019 以图形按钮显示的界面

实例说明 菜单和工具栏虽然能方便用户操作程序的相应功能&#xff0c;但各有缺点。如果采用按钮式功能菜单&#xff0c;不但美观大方&#xff0c;而且操作灵活。当单击按钮时&#xff0c;用户区将显示相应的操作按钮组。下面介绍图形界面式菜单的设计方法。运行本例&#xff0…