zoukankan      html  css  js  c++  java
  • maven中的依赖的范围、传递、冲突,继承

     1 <dependency>
     2             <groupId>com.alibaba</groupId>
     3             <artifactId>druid</artifactId>
     4             <version>1.1.4</version>
     5         <scope>test</scope>
     6         <optional></optional>
     7 
     8                <exclusions>
     9                     <exclusion>  
    10                         <groupId>com.alibaba</groupId>
    11                         <artifactId>jconsole</artifactId>        注意这里没有写版本
    12                     </exclusion>  
    13                     <exclusion>
    14                         <groupId>com.alibaba</groupId>
    15                         <artifactId>tools</artifactId>
    16                     </exclusion>
    17             </exclusions>
    18 </dependency>

    依赖范围 

      <scope>是指定依赖范围。有六个值:
          

          Compile是默认的范围。编译测试运行都有效。

          Provided 编译、测试有效。

          Runtime 测试、运行时有效。

          Test  只测试有效

          System 编译、测试有效。

          Import  只用在dependencyManagement中,表示从其他pom中导入depency的配置?意思是复制其他地方的配置?

      

      开发中用到某个框架,要将框架的jar包引入到classpath中。

      Maven有三个classpath:

               编译、测试、运行

      依赖的范围就是控制依赖和三个classpath的关系(在哪个阶段)

    依赖传递

      A依赖B,B依赖C,则A 默认是传递依赖C(我跟你混,你跟他混,那我默认也是跟他混),但前提是B对C的依赖是compile。A不想依赖C,则需要排除依赖。在<exclusions></exclusion>中配置;或者在<optional></optional>中配置

      项目的这个位置可以查看本项目的依赖:

              

        如果项目A的pom里设置依赖B,项目B的pom里设置依赖C,项目A编译后,可以在此位置看到B和C(B和C是自己写的项目的话,首先要打包进本地仓库)。

     ps:

      如果依赖的是仓库里的jar,那首先去本地仓库里找,找不到就去中央仓库找,再找不到就报错。

      如果依赖的是自己的另一个项目,首先需要把自己的项目打包进本地仓库才行(项目运行Goals那里依次执行package命令和install命令)。要不是找不到的。

    <exclusions>

      可以在A的pom里的对B的依赖部分添加<exclusions></exclusion>:

     1       <dependency>
     2 
     3           B的坐标
     4 
     5           <exclusions>
     6 
     7             这里面写C的坐标。
                  这里不能写版本,只写前面两个坐标。写版本报错。
    8 9           </exclusion> 10 11       </dependency>

       这样,A在依赖B的同时,不继承B对C的依赖。

    <optional>

      可以在B对C的依赖部分添加<optional>

           <dependency>
     
               C的坐标
     
               <optional>true </optional>
     
           </dependency>

      这样的意思是,C只被B依赖,如果A依赖B,并不会被传递依赖C。<optional></optional>的默认值是FALSE,默认是继承依赖

      当然,如果A也想要依赖C,在自己的pom里声明对C的依赖就可以了。

    继承:

    A依赖B,B依赖C,B对C的依赖是compile,则A 默认是传递依赖C。如果不想看B和C是不是compile,那只要A是继承B,就自然接受B的所有依赖关系

    注意父工程B的打包方式要是pom。(Java工程是jar,web项目是war)

    依赖冲突:

      是指有多条依赖传递到同一个jar,就需要确定到底是走哪一条依赖传递。有两个原则:短路径优先;先声明优先

      比如:

        A->B->C->X

        A->D-X

      此时默认是选路径最短的那一条。

      

      如果路径一样长的时候:

          1.同一个pom里,依赖同一个jar的不同版,是后面的覆盖前面的。(项目的pom里写了一个jar的不同版本的多个依赖)

          2.不同的pom里,也就是有传递:

               A->B->X

               A->D->X

            就选最先声明的。在A 的pom里,B和D谁的<dependency>写在前面,就选谁。

  • 相关阅读:
    .net core3.1 abp动态菜单和动态权限(思路) (二)
    .net core3.1 abp学习开始(一)
    api.versioning 版本控制 自动识别最高版本
    .netcore 定制化项目开发的思考和实现
    netcore 非注入全局获取配置文件
    linux nginx搭建与使用
    linux docker .net core 从建立网站到预览
    linux 学习 mysql安装到连接
    linux 安装redis及问题收集
    为何说要多用组合少用继承?如何决定该用组合还是继承?
  • 原文地址:https://www.cnblogs.com/youwuyi/p/10255799.html
Copyright © 2011-2022 走看看