当前位置: 首页 > news >正文

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

依赖的特性

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{@Testpublic 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

相关文章:

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

依赖的特性 scope标签在dependencies/dependency标签内,可选值有compile(默认值),test,provided,system,runtime,import compile&#xff1a;在项目实际运行时真正要用到的jar包都是以compile的范围进行依赖 ,比如第三方框架SSM所需的jar包test&#xff1a;测试过程中使用的j…...

科技为饮食带来创新,看AI如何打造智能营养时代

在当今社会&#xff0c;快节奏的生活方式、便捷的食品选择以及现代科技的快速发展正深刻地重塑着我们对健康的认知和实践&#xff0c;它已经不再仅仅是一个话题&#xff0c;而是一个备受关注的社会焦点。在这个纷繁复杂的交汇点上&#xff0c;AI技术的介入为我们开辟了前所未有…...

软件测试知识库+1,5款顶级自动化测试工具推荐和使用分析

“工欲善其事必先利其器”&#xff0c;在自动化测试领域&#xff0c;自动化测试工具的核心地位不容置疑的。目前市面上有很多可以支持接口测试的工具&#xff0c;在网上随便一搜就可以出来很多&#xff0c;利用自动化测试工具进行接口测试&#xff0c;可以很好的提高测试效率&a…...

代码随想录算法训练营第23期day22|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 一、&#xff08;leetcode 669&#xff09;修剪二叉搜索树 二、&#xff08;leetcode 108&#xff09;将有序数组转换为二叉搜索树 三、&#xff08;leetcode 538&#xff09;把二叉搜索树转换为累加树 一、&#xff08;leetcode 669&#xff09;修剪二叉搜索树 力扣题…...

IDEA中创建Web工程流程

第一步&#xff1a;File--》New--》Project 第二步&#xff1a;填写信息&#xff0c;点击Create 第三步&#xff1a;点击File,点击Project Structure 出现该界面 选择相应的版本&#xff0c;这里我用jdk17&#xff0c;点击apply &#xff0c;点击ok 第三步&#xff1a;右键文件…...

【论文阅读】基于卷积神经的端到端无监督变形图像配准

&#x1f4d8;End-to-End Unsupervised Deformable ImageRegistration with a Convolutional NeuralNetwork &#x1f4d5;《基于卷积神经的端到端无监督变形图像配准》 文章目录 摘要 Abstract. 1.导言 Introduction 附录 References未完待续 to be continued ... 摘要 Abstr…...

【Rust】包和模块,文档注释,Rust格式化输出

文章目录 包和模块包 CrateRust 的标准目录结构 模块 Module用路径引用模块使用super引用模块使用self引用模块结构体和枚举的可见性 使用 use 引入模块及受限可见性基本引入方式绝对路径引入模块相对路径引入模块中的函数 避免同名引用 注释和文档文档注释包和模块级别的注释注…...

leetcode221.最大正方形

最大正方形 可以使用动态规划降低时间复杂度。用 dp(i,j) 表示以 (i,j)为右下角&#xff0c;且只包含 111 的正方形的边长最大值。能计算出所有 dp(i,j)的值&#xff0c;那么其中的最大值即为矩阵中只包含 111 的正方形的边长最大值&#xff0c;其平方即为最大正方形的面积。 …...

低代码技术这么香,如何把它的开发特点发挥到极致?

前言 什么是低代码技术&#xff1f; 低代码是一种可视化软件开发方法&#xff0c;通过最少的编码更快地交付应用程序。图形用户界面和拖放功能使开发过程的各个方面自动化&#xff0c;消除了对传统计算机编程方法的依赖。 文章目录 前言低代码平台怎么选&#xff1f;用友Yonbu…...

drawio简介以及下载安装

drawio简介以及下载安装 drawio是一款非常强大的开源在线的流程图编辑器&#xff0c;支持绘制各种形式的图表&#xff0c;提供了 Web端与客户端支持&#xff0c;同时也支持多种资源类型的导出。 访问网址&#xff1a;draw.io或者直接使用app.diagrams.net直接打开可以使用在线版…...

Sql Server 数据库中的所有已定义的唯一约束 (列名称 合并过了)

查询Sql Server Database中的唯一约束 with UniqueBasic as (SELECTtab.name AS TableName, -- 表名称idx.name AS UniqueName, -- 唯一约束的名称col.name AS UniqueFieldName -- 唯一约束的表字段FROMsys.indexes idxJOIN sys.index_columns idxColON (idx.object_id idxCo…...

elasticsearch (六)filebeat 安装学习

filebeat 安装&#xff1a;文件节拍快速入门&#xff1a;安装和配置 |文件节拍参考 [7.17] |弹性的 (elastic.co) 解压缩后&#xff0c;以配置nginx日志为例。 Nginx module | Filebeat Reference [7.17] | Elastic filebeat 配置中&#xff0c; - module: nginx access: …...

算法通关村第一关|青铜|链表笔记

1.理解 Java 如何构造出链表 在 Java 中&#xff0c;我们创建一个链表类&#xff0c;类中应当有两个属性&#xff0c;一个是结点的值 val &#xff0c;一个是该结点指向的下一个结点 next 。 next 通俗讲是一个链表中的指针&#xff0c;但是在链表类中是一个链表类型的引用变量…...

【记录】使用Python读取Tiff图像的几种方法

文章目录 PIL.Imagecv2gdal 本文总结了使用 PIL Image, cv2, gdal.Open三种python package 读取多通道Tiff格式遥感影像的方法。 PIL.Image PIL对Tiff只支持两种格式的图像&#xff1a; 多通道8bit图像单通道int16, int32, float32图像 多通道多bit的tiff图像PIL不支持读取…...

JOSEF约瑟 多档切换式漏电(剩余)继电器JHOK-ZBL1 30/100/300/500mA

系列型号&#xff1a; JHOK-ZBL多档切换式漏电&#xff08;剩余&#xff09;继电器&#xff08;导轨&#xff09; JHOK-ZBL1多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBL2多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBM多档切换式漏电&#xf…...

Linux部署kubeedge 1.4

文章目录 一、机器信息二、环境准备&#xff08;所有节点操作&#xff09;2.1. 修改主机名2.2. 开启路由转发2.3.安装Docker&#xff08;所有节点&#xff09;2.4.部署K8S集群(单机版&#xff0c;云端节点) 2.5.安装Mosquitto&#xff08;只在边缘节点安装)三、安装kubeedge 1.…...

第一章习题

文章目录 x ( t ) j e j w 0 t x(t)je^{jw_0t} x(t)jejw0​t x [ n ] j e j w 0 n x[n]je^{jw_0n} x[n]jejw0​n 求基本周期&#xff1a; T 2 Π w 0 T\frac{2Π}{w_0} Tw0​2Π​ 对x[n],T为有理数才算 1、求信号x(t)2cos(10t1)-sin(4t-1)的基波周期 2 Π 10 Π 5 \frac{2…...

nvm、node、npm解决问题过程记录

在Windows10如何降级Node.js版本&#xff1a;可以尝试将Node.js版本降级到一个较旧的版本&#xff0c;以查看问题是否得以解决。可以使用Node Version Manager (nvm) 来轻松切换Node.js版本&#xff0c;具体完整步骤&#xff1a; 首先&#xff0c;需要安装Node Version Manager…...

Linux- DWARF调试文件格式

基本概念 DWARF是一个用于在可执行程序和其源代码之间进行关联的调试文件格式。当开发者使用调试编译选项&#xff08;例如&#xff0c;使用gcc时的-g标志&#xff09;编译程序时&#xff0c;编译器会生成这种格式的调试信息。这些信息在后续的调试过程中非常有用&#xff0c;…...

软件工程第六周

软件体系结构概述 体系结构&#xff1a;一种思想&#xff0c;而框架就是思想的实现&#xff0c;设计模式就是根据某一特殊问题实现的框架。 体系结构&#xff1a;体系结构是软件系统的高级结构。它定义了系统的主要组成部分&#xff0c;以及这些部分之间的关系和交互方式。 框…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...

用js实现常见排序算法

以下是几种常见排序算法的 JS实现&#xff0c;包括选择排序、冒泡排序、插入排序、快速排序和归并排序&#xff0c;以及每种算法的特点和复杂度分析 1. 选择排序&#xff08;Selection Sort&#xff09; 核心思想&#xff1a;每次从未排序部分选择最小元素&#xff0c;与未排…...

【Vue】scoped+组件通信+props校验

【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性&#xff0c; 令样式只作用于当前组件的标签 作用&#xff1a;防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…...

Spring Boot 与 Kafka 的深度集成实践(二)

3. 生产者实现 3.1 生产者配置 在 Spring Boot 项目中&#xff0c;配置 Kafka 生产者主要是配置生产者工厂&#xff08;ProducerFactory&#xff09;和 KafkaTemplate 。生产者工厂负责创建 Kafka 生产者实例&#xff0c;而 KafkaTemplate 则是用于发送消息的核心组件&#x…...

【SSM】SpringMVC学习笔记7:前后端数据传输协议和异常处理

这篇学习笔记是Spring系列笔记的第7篇&#xff0c;该笔记是笔者在学习黑马程序员SSM框架教程课程期间的笔记&#xff0c;供自己和他人参考。 Spring学习笔记目录 笔记1&#xff1a;【SSM】Spring基础&#xff1a; IoC配置学习笔记-CSDN博客 对应黑马课程P1~P20的内容。 笔记2…...