zoukankan      html  css  js  c++  java
  • maven依赖范围

    maven依赖范围

    • 编译依赖范围(compile)
    • 测试依赖范围(test)
    • 已提供依赖范围(provided)
    • 运行时依赖范围(runtime)
    • 系统依赖范围(system)
    • 导入依赖范围(import)

    编译依赖范围(compile)

    该范围就是默认依赖范围,此依赖范围对于编译、测试、运行三种classpath都有效,举个简单的例子,假如项目中有spring-core的依赖,那么spring-core不管是在编译,测试,还是运行都会被用到,因此spring-core必须是编译范围(构件默认的是编译范围,所以依赖范围是编译范围的无须显示指定)

    <dependency>  	  
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>2.5</version>  	  <scope>compile</scope><!--默认为该依赖范围,无须显示指定-->
    </dependency>
    

    测试依赖范围(test)

    顾名思义就是针对于测试的,使用此依赖范围的依赖,只对测试classpath有效,在编译主代码和项目运行时,都将无法使用该依赖,最典型的例子就是 Junit, 构件在测试时才需要,所以它的依赖范围是测试,因此它的依赖范围需要显示指定为test ,当然不显示指定依赖范围也不会报错,但是该依赖会被加入到编译和运行的classpath中,造成不必要的浪费 。

    <dependency>  	  
        <groupId>junit</groupId>  	  
        <artifactId>junit</artifactId>  	  
        <version>4.7</version>  	 
        <scope>test</scope>    
    </dependency>
    

    已提供依赖范围(provided)

    使用该依赖范围的maven依赖,只对编译和测试的classpath有效,对运行的classpath无效,典型的例子就是servlet-api,编译和测试该项目的时候需要该依赖,但是在运行时,web容器已经提供的该依赖,所以运行时就不再需要此依赖,如果不显示指定该依赖范围,并且容器依赖的版本和maven依赖的版本不一致的话,可能会引起版本冲突,造成不良影响。

    <dependency>  	  
        <groupId>javax-servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
    </dependency>
    

    运行时依赖范围(runtime)

    使用该依赖范围的maven依赖,只对测试和运行的classpath有效,对编译的classpath无效,典型例子就是JDBC的驱动实现,项目主代码编译的时候只需要JDK提供的JDBC接口,只有在测试和运行的时候才需要实现上述接口的具体JDBC驱动。

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

    系统依赖范围(system)

    该依赖与classpath的关系与provided依赖范围完全一致,但是系统依赖范围必须通过配置systemPath元素来显示指定依赖文件的路径,此类依赖不是由maven仓库解析的,而且往往与本机系统绑定,可能造成构件的不可移植,因此谨慎使用,systemPath元素可以引用环境变量:

    <dependency>  	  
        <groupId>javax.sql</groupId>
        <artifactId>jdbc-stext</artifactId>
        <version>2.0</version>
        <scope>system</scope>
        <systemPath>${java.home}/lib/rt.jar</systemPath>
    </dependency>
    

    导入依赖范围(import)

    该依赖范围不会对三种classpath产生影响,该依赖范围只能与dependencyManagement元素配合使用,其功能为将目标pom文件中dependencyManagement的配置导入合并到当前pom的dependencyManagement中。有关dependencyManagement的功能请了解maven继承特性。

    依赖传递

    -------------------------------------------------------------------
     scope         compile       test         provided            runtime
    -------------------------------------------------------------------
    compile     compile        -            -                  runtime
    test         test          -            -                   test
    provided    provided       -           provided            provided
    runtime     runtime        -            -                  runtime
    -------------------------------------------------------------------
    

    依赖调解

    // 当项目中传递依赖出现包重复,版本不同时,需要依赖调解
    规则:
    1. A->B-C(1.0)  A->D->F->C(2.0) ; 依赖路径短者优先
    2. A->B-C(1.0)  A->D->C(2.0) ; 依赖路径相同时,先申明者优先
    

    可选依赖

    dependency
    <optional>true</optional> 
    
    传递依赖时不会引入需要手动引入可选依赖的包
    

    排除依赖

    <exclusions>
    	<exclusion>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-logging</artifactId>
    	</exclusion>
    </exclusions>
    

    如果觉得文章对您有用,请点下推荐。您的支持将鼓励我继续创作!

  • 相关阅读:
    c++11 内存模型解读
    无锁队列的实现
    c++中的原子操作
    还是说Memory Model,gcc的__sync_synchronize真是太坑爹了
    对于Linux平台下C语言开发中__sync_函数的认识
    理解 Memory barrier
    pthread_barrier_init,pthread_barrier_wait简介
    explicit构造函数的作用
    droofs
    27.
  • 原文地址:https://www.cnblogs.com/pengsn/p/13565728.html
Copyright © 2011-2022 走看看