• 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不存在
    
    • 1

    验证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(){
            //....
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    测试依赖的传递性

    传递的原则: 在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工程可以使用的依赖
    
    <dependency>
        
    	<groupId>org.springframeworkgroupId>
    	<artifactId>spring-coreartifactId>
    	<version>4.0.0.RELEASEversion>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    • pro01-maven-java对spring-core依赖的范围是compile其可以传递, spring-core对commons-logging的依赖范围是compile其可以传递
    • 使用mvn dependency:tree命令查看pro02-maven-web工程可以使用的依赖
    
    <dependency>
    	<groupId>com.atguigu.mavengroupId>
    	<artifactId>pro01-maven-javaartifactId>
    	<version>1.0-SNAPSHOTversion>
        <scope>compilescope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    > [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
    
    • 1
    • 2
    • 3
    • 4

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

    <--当前工程是pro01-maven-java-->
    <dependencies>
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12version> 
            <scope>testscope>
        dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    <--当前工程是pro01-maven-java-->
    <dependency>
    	<groupId>javax.servletgroupId>
    	<artifactId>javax.servlet-apiartifactId>
    	<version>3.1.0version>
    	<scope>providedscope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    > [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
    
    • 1
    • 2
    • 3
    • 4

    配置依赖排除

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

    在这里插入图片描述

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

    <dependency>
    	<groupId>com.atguigu.mavengroupId>
    	<artifactId>pro01-maven-javaartifactId>
    	<version>1.0-SNAPSHOTversion>
    	<scope>compilescope>
    	
    	<exclusions>
    		
    		<exclusion>
    			
    			<groupId>commons-logginggroupId>
    			<artifactId>commons-loggingartifactId>
    		exclusion>
    	exclusions>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行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
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Day 52 单调栈 part01
    BFC详解(Block Formmating Context)
    多线程与高并发——并发编程(7)
    c++调用相机进行保存
    MyCat2的介绍与安装以及基本使用
    Linux系统调用
    PyTorch Lightning入门教程(二)
    1412. 查找成绩处于中游的学生
    es6-promise对象详解
    设计模式:简单工厂、工厂方法、抽象工厂
  • 原文地址:https://blog.csdn.net/qq_57005976/article/details/133846315