Maven依赖

元素

  • groupId 组织名称
  • artifactId 项目名称
  • version 版本号
  • type 依赖的类型,默认值为jar
  • scope 依赖的范围。maven编译、测试、允许用的是各自的classpath。
    • compile:编译依赖范围。没有指定,就会默认使用此值。对于编译、测试、运行三种classpath都有效。典型的例子是spring-core。
    • test:测试依赖范围。只对测试classpath有效。典型的例子是JUnit。
    • provided:已提供依赖范围。对编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,运行时,容器已经提供,就不需要maven重复引用。
    • runtime:运行时依赖范围。对于测试和运行classpath有效,编译时无效。典型的例子是JDBC驱动实现,编译只需要JDK提供的JDBC接口,执行测试或运行时才需要具体的实现。
    • system:系统依赖范围。与classpath的关系,和provided完全一致。但是,使用system范围的依赖时必须通过systemPath元素显示的指定依赖文件的路径。由于此类依赖不是通过maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应谨慎使用。systemPath元素可以应用环境变量。
    • import:导入依赖范围。该依赖不会对三种classpth产生实际的影响。(后面单独说)
  • optional 标记的依赖是否可选
  • exclusions 用来排除传递性依赖

传递性依赖的依赖范围

​ 依赖范围不仅控制依赖与三种classpath的关系,还对传递性依赖产生影响。假设A依赖于B,B依赖于C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。第一直接依赖(A)的范围和第二直接依赖(B)的范围决定了传递性依赖的范围。如表所示,最左一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围,中间表示传递性依赖范围。

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

依赖调解

引入的一个依赖有两个版本时,maven会选择自动选择其中的一个版本,此为依赖调解。

依赖调解的两个原则:

  • 第一原则:路径最近这优先。
  • 第二原则:第一声明者优先,在POM中顺序考前的那个依赖优胜。

例如,项目A有这样的依赖关系:A->B->C->X(1.0),A->D->X(2.0),X是A的传递性依赖,maven会选择X(2.0)。如果还有一条依赖路径A->E->X(3.0),就看X(2.0)和X(3.0)睡前声明。

可选依赖(optional )

​ 项目A依赖于项目B,项目B依赖于项目X(可选)和项目Y(可选)。由于X、Y是可选依赖,依赖是不会得以传递。也就是说X、Y不会对A有任何影响。项目A需要显示的声明X或Y。

​ 为什么要有可选依赖这一特性呢?可能项目B实现了两个特性,其中的特性一依赖于X,特性二依赖于B,而且这两个依赖是互斥的,用户不可能同时使用两个特性。比如数据库(mysql、oracle)。具体依赖声明如下:


    4.0.0
    com.meng
    project-B
    
    
        
            mysql
            mysql...
            true
        
        
            oracle
            coacle...
            true
        
    

​ 关于可选依赖需要说明一点,在理想情况下,是不应该使用可选依赖的。上述例子中,更好的做法是为mysql和oracle分别创建一个maven项目。

排除依赖(exclusions)

​ 项目A依赖于项目B,由于一些原因,不想引用传递性依赖C,而是自己显示的声明对于项目的C某个版本的依赖。exclusions可以包含一个或多个exclusion子元素,因此可以排除一个或多个传递性依赖。需要注意的是,声明exclusion时只需要groupId和artifactId,而不需要version元素,groupId和artifactId就能唯一定位依赖图中的某个依赖。


    
        com.meng
        project-b
        1.0.0
        
            
                com.meng
                project-c
            
        
    
    
        com.meng
        project-c
        1.0.1
    

归类依赖(properties)

​ 就是常量的概念。使用properties元素定义一个Maven属性,有这个属性后,就可以在下文中用${}的方式引用Maven属性。


    1.7.26
    1.2.3



    
        org.slf4j
        slf4j-api
        ${slf4j.version}
    
    
        org.slf4j
        slf4j-log4j12
        ${slf4j.version}
    
    
        ch.qos.logback
        logback-classic
        ${logback.version}
    

查看依赖

  • mvn dependency:list 依赖列表
  • mvn dependency:tree 依赖树形列表,可以看清楚某个依赖的传递路径。
  • mvn dependency:analyze 依赖分析。运行后,会有两个部分。一部分是Used undeclared dependencies,指项目中使用到,但没有显示声明的依赖。这种依赖意味着潜在的风险,但升级直接依赖时,相关传递性依赖可能会发生变化,这种变化不易察觉,有可能导致项目出错。还有一部分是Unused declared dependencies,指项目中未使用的,但显示声明的依赖。需要注意的是,对与这样的依赖,我们不能直接删除其声明,而需要仔细分析。dependency:analyze只会分析编译和测试需要的依赖,一些执行测试和运行时需要的依赖它发现不了,比如spring-core、spring-beans等是运行spring项目的必要类库。

你可能感兴趣的:(Maven依赖)