Maven--坐标和依赖

一、坐标

任何一个构件(jar、war)都可以用Maven坐标唯一表示。

Maven坐标有五个元素构成groupId、artifactId、version、packaging、classifier。

   groupId:定义当前Maven项目隶属的实际项目 与java包名的表示方式类似,通常与域名反向一一对应。

   artifactId:该元素定义实际项目中的一个Maven项目(模块),实际项目名前缀+模块名的形式。

   version:构件的版本信息。

   packaging:打包方式,默认的是jar,jar和war打包会使用不同的命令,影响构件的生命周期。

   classifier:该元素用来帮助定义构建输出一些附属构件(一些类似于**-doc.jar和**-sources.jar).。

其中前三个是必须定义的,packaging是可选的,默认是jar,classifier是不必定义的。


二、依赖

在声明依赖时,每个依赖可以包含的元素有:

groupId、artifactId和version  :依赖的基本坐标,是最重要的。

type:依赖的类型,对应于坐标定义的packaging,大部分情况下不必定义默认值为jar

scope:依赖的范围。

optional:标记依赖是否可选。

exclusions:用来排除传递性依赖。

1、依赖范围

 依赖范围是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系:

 (1)compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。

 (2)test:测试依赖范围。使用此依赖范围的Maven依赖,只对测试classpath有效,在编译主代码或者运行项目的时候将无法使用此依赖。比如JUnit

  (3)provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。比如servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复引入一遍。

  (4)runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。比如JDBC驱动实现,项目主代码编译只需要JDK提供的JDBC接口,只在执行测试或者运行的时候才需要实现上述接口的具体JDBC驱动。

 (5)system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致,但是使用system范围的依赖时必须通过systemPath元素显示指定依赖文件的路径。

  (6)import:导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。

2、依赖传递

    A-->B    B-->C   那么A-->C

    如果A依赖了B,B依赖了C,那么A也依赖于C,B对于A来说是直接依赖,也叫第一直接依赖,C对于A来说相当于是传递性依赖。

3、依赖冲突

     一般情况下我们不需要关系传递性依赖,那么当多个传递性依赖中有对于同一个构件不同版本的依赖时,那么到底会依赖那个版本?会不会产生冲突?

 遵守两个原则:

  (1)短路径优先原则,A-->B-->C-->X(版本1.0)和A-->D-->X(版本2.0),那么会选择短路径的2.0版本。

 (2)在路径长度一致的时候,会遵循第二原则:先声明原则,谁先声明,谁会被采用

4、依赖排除

      上面我们说过了短路径优先原则,那么如果我们就想用长路径的依赖肿么办那???

      可以用我们上面提到的<exclusions>元素来把短路径的依赖排除掉。

      在不冲突的时候这个标签也可以用,排除某个不需要的依赖。

5、依赖归类

     主要作用是用来统一管理,便于维护和升级。

     比如我们项目中同时依赖了统一构件的不同模块,他们的版本是相同,这时候就可以进行归类。用到了Maven的属性,类似于变量的概念。

<properties>
    <springframework.version>3.2.0.RELEASE</springframework.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${springframework.version}</version>
    </dependency>
</dependencies>

猜你喜欢

转载自blog.csdn.net/wxr15732623310/article/details/79504075