07测试Maven中依赖的范围,依赖的传递原则,依赖排除的配置

news2024/11/29 20:55:24

依赖的特性

scope标签dependencies/dependency标签内,可选值有compile(默认值),test,provided,system,runtime,import

  • compile:在项目实际运行时真正要用到的jar包都是以compile的范围进行依赖 ,比如第三方框架SSM所需的jar包
  • test:测试过程中使用的jar包通常以test的范围依赖进来 , 比如junit依赖
  • provided:在开发过程中需要用到的“服务器上的 jar 包”通常以provided的范围依赖进来 , 比如 servlet-api、jsp-api

测试依赖的范围

测试compile , test , provided三种依赖范围的对比

  • provided范围的jar包不参与部署不放进war包,这样可以避免和服务器上已有的同类jar包产生冲突,同时减轻服务器的负担
main目录(空间)test目录(空间)开发过程(时间)部署到服务器(时间)
compile有效有效有效有效(参与打包)
test无效有效有效无效(不参与打包)
provided有效有效有效无效(不参与打包)

验证compile范围对main/test目录有效: 判断main/test目录下的某个类是否可以使用以compile范围导入的pro01--maven-java依赖中的Calculator类

  • 在HelloServlet/CalculatorTest类中可以导入Calculator类并且编译成功说明有效

验证test范围对main目录无效: 在主体程序Calculator中导入org.junit.Test这个注解,执行Maven编译命令失败说明无效

[ERROR] /D:/maven-workspace/space201026/pro01-maven-java/src/main/java/com/atguigu/maven/Calculator.java:程序包org.junit不存在

验证test和provided范围不参与服务器部署: 通过compile范围依赖的jar包会放入war包,通过test范围依赖的jar包不会放入war包

验证provided范围对test目录有效: 在pro02-maven-web的测试程序CalculatorTest中使用servlet-api.jar包中的类,执行Maven编译命令成功说明有效

package com.atguigu.maven;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import org.junit.Test;
import com.atguigu.maven.Calculator;
// 静态导入的效果是将Assert类中的静态资源导入当前类
// 这样一来,在当前类中就可以直接使用Assert类中的静态资源,不需要写类名
import static org.junit.Assert.*;
public class CalculatorTest{
	@Test
	public void testSum(){
        //....
	}
}

测试依赖的传递性

传递的原则: 在A依赖B,B依赖C的前提下,在A没有配置对C的依赖的情况测试C是否能够传递到A

  • B对C的依赖范围是compile范围那么C可以传递
  • B对C的依赖范围是test或provided范围那么C不可以传递,所以需要这样的jar包时,就必须在需要的地方明确配置依赖才可以
  • C是否能够传递到A取决于B依赖C时使用的依赖范围,与A依赖B时的范围无关,即使A是对B的依赖范围是test/provided范围,C该传递还是能传递

验证compile范围的依赖可以传递: 编辑pro01-maven-java工程根目录下pom.xml文件, 让当前工程可以使用commons-logging依赖中的类

  • spring-core依赖对commons-logging依赖范围是compile范围,所以commons-logging依赖可以传递
  • 修改了本地工作空间的pro01-maven-java的pom.xml文件 , 需要需要使用Maven命令重新生成pro01-maven-java的XXX.pom文件然后存入到本地仓库
  • 使用mvn dependency:tree/list命令查看pro01-maven-java工程可以使用的依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
    <!--默认以compile范围导入spring-core依赖-->
	<groupId>org.springframework</groupId>
	<artifactId>spring-core</artifactId>
	<version>4.0.0.RELEASE</version>
</dependency>
[INFO] com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT
#junit对hamcrest-core的依赖范围是compile,所以可以传递
[INFO] +- junit:junit:jar:4.12:test
#这里显示test是因为我们是以test范围引入的junit,并不是说junit对hamcrest-core的依赖范围是test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO] 	 \- commons-logging:commons-logging:jar:1.1.1:compile

pro02-maven-web工程也可以使用commons-logging依赖中的类

  • pro01-maven-java对spring-core依赖的范围是compile其可以传递, spring-core对commons-logging的依赖范围是compile其可以传递
  • 使用mvn dependency:tree命令查看pro02-maven-web工程可以使用的依赖
<!--依赖pro01-maven-java的-->
<dependency>
	<groupId>com.atguigu.maven</groupId>
	<artifactId>pro01-maven-java</artifactId>
	<version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
</dependency>
> [INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT,
> [INFO] \- com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
> [INFO]   \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
> [INFO]     \- commons-logging:commons-logging:jar:1.1.1:compile

验证test范围不能传递依赖: 在pro01-maven-java加入了的junit依赖,但是在pro02-maven-web工程中查看依赖树的时候并没有看到junit

<--当前工程是pro01-maven-java-->
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version> 
        <scope>test</scope>
    </dependency>
</dependencies>

验证provided范围不能传递依赖: 在pro01-maven-java工程中加入了servlet-api的依赖, 但是在pro02-maven-web工程中查看依赖树的时候并没有看到该依赖

<--当前工程是pro01-maven-java-->
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>3.1.0</version>
	<scope>provided</scope>
</dependency>
> [INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT
> [INFO] \- com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
> [INFO]   \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
> [INFO]     \- commons-logging:commons-logging:jar:1.1.1:compile

配置依赖排除

当A依赖B,B依赖C而且C可以传递到A的时候,A如果不想要C,可以使用exclude标签在A里面把C排除掉(阻止某些jar包的传递可以避免jar包之间的冲突)

在这里插入图片描述

配置对commons-logging依赖的排除: 使用exclude标签指定要排除的具体的坐标并且不需要写版本号 , 只会阻止依赖传递到当前工程不影响其他依赖的传递

<dependency>
	<groupId>com.atguigu.maven</groupId>
	<artifactId>pro01-maven-java</artifactId>
	<version>1.0-SNAPSHOT</version>
	<scope>compile</scope>
	<!--使用excludes标签配置依赖的排除-->
	<exclusions>
		<!--在exclude标签中配置一个具体的排除 -->
		<exclusion>
			<!--指定要排除的依赖的坐标(不需要写version)-->
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>

运行mvn dependency:tree命令发现pro02-maven-web工程下的spring-core依赖下面已经没有commons-logging依赖

[INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] \- com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO] 	  \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据基础技能入门指南

本文介绍了数据工作中数据基础和复杂数据查询两个基础技能。 背景 当下&#xff0c;不管是业务升级迭代项目&#xff0c;还是体验优化项目&#xff0c;对于数据的需求都越来越大。数据需求主要集中在以下几个方面&#xff1a; 项目数据看板搭建&#xff1a;特别是一些AB实验的看…

【算法练习Day20】修剪二叉搜索树将有序数组转换为二叉搜索树把二叉搜索树转换为累加树

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 修剪二叉搜索树将有序数组转…

Grade 5 Math

数形结合 5 2 3 https://download.csdn.net/download/spencer_tseng/88431286

深入理解 Java 中的 synchronized 关键字

引入多线程的重要性和挑战 可以参考另一篇文章 https://blog.csdn.net/qq_41956309/article/details/133717408 JMM&#xff08;Java Memory Model&#xff0c;Java 内存模型&#xff09; 什么是JMM JMM&#xff08;Java Memory Model&#xff0c;Java 内存模型&#xff09…

怎么在抖音上引流?分享五个抖音引流推广必备的几个方法

大家好&#xff0c;我是 小刘今天为大家分享的是抖音引流知识分享&#xff0c;今天咱们聊一些干货知识&#xff0c;绝对会让你们有一个重新的认知。抖音的流量大&#xff0c;是毋庸置疑的&#xff0c;抖音也是最早一批短视频平台。抖音于2017年上线&#xff0c;一开始主要是通过…

Golang学习记录:基础知识篇(一)

Golang学习&#xff1a;基础知识篇&#xff08;一&#xff09; 前言什么是Golang&#xff1f;Go语言的基础语法语言结构基础语法数据类型基础使用 前言 很久之前就想学Go语言了&#xff0c;但是一直有其他东西要学&#xff0c;因为我学的是Java嘛&#xff0c;所以后面学的东西…

配置VScode开发环境-CUDA编程

如果觉得本篇文章对您的学习起到帮助作用&#xff0c;请 点赞 关注 评论 &#xff0c;留下您的足迹&#x1f4aa;&#x1f4aa;&#x1f4aa; 本文主要介绍VScode下的CUDA编程配置&#xff0c;因此记录以备日后查看&#xff0c;同时&#xff0c;如果能够帮助到更多人&#xf…

操作系统导论-第四章作业(待更)

一、进程 进程就是运行中的程序&#xff0c;程序本身是没有生命周期的&#xff0c;它只是存储在磁盘上的一些指令&#xff08;或者一些静态数据&#xff09;&#xff0c;操作系统将这些指令和数据加载到内存中&#xff0c;使其运行起来。 1.1 虚拟化CPU技术 根据我们平时使用…

基于Java的共享充电宝管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

AI时代助力程序员与项目经理的双翼飞翔:从开发到成长的秘诀

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

企业网盘中支持在线编辑的有哪些选项?

企业网盘作为现代企业不可或缺的工具之一&#xff0c;为企业提供了便捷的文件存储和共享功能。而其中支持在线编辑的解决方案更是减少了对额外软件的依赖&#xff0c;使团队成员可以直接在浏览器中进行实时协作。 什么是在线编辑&#xff1f; 在线编辑是指用户无需下载文件&a…

3D 生成重建008-zero123让扩散模型了解空间信息zero-shot 单图生3d

3D 生成重建008-zero123让扩散模型了解空间信息zero-shot 单图生3d 文章目录 00 论文工作1 论文方法1.1 条件生成微调1.2 维护3d表示 2 效果 0 0 论文工作 之前分享的工作主要尝试是从一个pre-trained 文生图的diffusion模型中去蒸馏知识&#xff0c;从而去维护一个3d的表示…

数据结构上机实验——栈和队列的实现、栈和队列的应用、进制转换、约瑟夫环问题

文章目录 栈和队列上机实验1.要求2.栈的实现&#xff08;以顺序栈为例&#xff09;3.队列的实现&#xff08;以顺序队列为例&#xff09;4.利用栈实现进制转换5.利用队列解决约瑟夫环问题6.全部源码Stack.hQueue.htest.cpp 栈和队列上机实验 1.要求 1.利用栈的基本操作实现将任…

docker-compose部署elk(8.9.0)并开启ssl认证

docker部署elk并开启ssl认证 docker-compose部署elk部署所需yml文件 —— docker-compose-elk.yml部署配置elasticsearch和kibana并开启ssl配置基础数据认证配置elasticsearch和kibana开启https访问 配置logstash创建springboot项目进行测试kibana创建视图&#xff0c;查询日志…

李宏毅生成式AI课程笔记(持续更新

01 ChatGPT在做的事情 02 预训练&#xff08;Pre-train&#xff09; ChatGPT G-Generative P-Pre-trained T-Transformer GPT3 ----> InstructGPT&#xff08;经过预训练的GPT3&#xff09; 生成式学习的两种策略 我们在使用ChatGPT的时候会注意到&#xff0c;网站上…

2023/10/15

文章目录 1.uniapp之Vue2升Vue3值得注意的几点1.1 页面生命周期的使用1.2 引入资源的方式 2. 浏览器本地存储之Cookie和webStorage3. CSS变量 var()的用法4. CSS之实现线性渐变背景5. 图片无法和文字对齐的正确解决方案6. 使用正则处理接口返回的富文本内的图片7. transition实…

Java练习题-获取数组元素最大值

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java练习题 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又…

[cpp primer随笔] 11. 内联函数与constexpr函数

1. 内联函数 调用函数一般比对等价表达式求值要慢。因为调用函数除了对表达式求值外&#xff0c;还包含一系列过程&#xff0c;包括堆栈建立、拷贝实参、跳转执行等等。而在程序之中&#xff0c;通常存在一些优化规模较小、流程直接、却调用频率很高的函数&#xff0c;我们可以…

51系列—基于51单片机的集中抄表设计(代码+文档资料)

概述 自动抄表&#xff08;Automatic Meter Reading-AMR&#xff09;是指采用通讯和计算机网络等技术自动读取和处理表计数据。发展电能自动抄表技术是提高用电管理水平的需要&#xff0c;也是网络和计算机技术迅速发展的必然。在用电管理方面&#xff0c;采用自动抄表技术&am…

YOLOv5-QAT量化部署

目录 前言一、QAT量化浅析二、YOLOv5模型训练1. 项目的克隆和必要的环境依赖1.1 项目克隆1.2 项目代码结构整体介绍1.3 环境安装 2. 数据集和预训练权重的准备2.1 数据集2.2 预训练权重准备 3. 训练模型3.1 修改数据配置文件3.2 修改模型配置文件3.3 训练模型3.4 mAP测试 三、Y…