坐标和依赖(四)

坐标和依赖(四)

坐标是maven依赖管理的底层基础,通过坐标可以定位到唯一的一个依赖。

坐标详解

1.坐标定义的时候使用的坐标

定义该项目属于哪个组,这个组往往和项目所在的组织或公司存在关联,当前项目隶属的主项目,当前项目相当于一个模块,必须的属性。

<groupId>org.testng</groupId>

定义当前maven项目在组织中的唯一ID,定义模块,必须的属性

<artifactId>testng</artifactId>

定义当前项目的版本,版本分为快照SNAPSHOT(快照版本)和发布RELEASE(发布版本)、最新LATEST(快照和发布的集合中最新版本)类型,发布的为稳定版本,maven解析规则:带有版本号的解析版本号目录下的metadata元数据配置文件,不带有版本号的解析artifactId目录下的metadata元数据配置文件,插件不声明版本默认是RELEASE,必须的属性。

<version>6.13.1</version>

定义构建输出文件类型,默认不写为jar,maven-plugin(插件类型)为类型的时候,输出的文件是jar类型

<packaging>pom</packaging>

该属性用来帮助定义构建输出的一些附属构件,附属构件和主构件相对应,如testng-6.13.1-jdk15.jar,该属性不能直接定义,坐标格式为:artifactId-version[-classifier].packaging,定义构件生成的附属构件,比如构建的时候通过插件生成了该构件的源码包、项目文档等,如abc-1.1.jar的附属构建 abc-1.1-source.jar、abc-1.1-javadoc.jar,又如TestNG.jar包有不同平台的,当我们需要使用1.5平台的包,在声明依赖坐标的时候就要用classifier属性声明“<classifier>jdk5</classifier>" 关联的jar是TestNG-jdk5.jar,classifier属性在定义的时候不能明确声明,只能用在依赖声明上。

<classifier>jdk15</classifier>

2.依赖声明的时候使用的坐标元素

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>1.0-SNAPSHOT</version>

该属性用来帮助定义构建输出的一些附属构件,附属构件和主构件相对应,如testng-6.13.1-jdk15.jar,该属性不能直接定义,坐标格式为:artifactId-version[-classifier].packaging,定义构件生成的附属构件,比如构建的时候通过插件生成了该构件的源码包、项目文档等,如abc-1.1.jar的附属构建 abc-1.1-source.jar、abc-1.1-javadoc.jar,又如TestNG.jar包有不同平台的,当我们需要使用1.5平台的包,在声明依赖坐标的时候就要用classifier属性声明“<classifier>jdk5</classifier>" 关联的jar是TestNG-jdk5.jar,classifier属性在定义的时候不能明确声明,只能用在依赖声明上。

<classifier>jdk15</classifier>

定义构建输出文件类型,默认不写为jar,maven-plugin(插件类型)为类型的时候,输出的文件是jar类型

<packaging>jar</packaging>

依赖范围:

项目编译的时候使用一套主代码的classpath,项目编译测试的时候使用test的classpath,他们是不同的classpath,运行时有一套运行classpath,依赖范围就是用来控制依赖与这三种classpath的关系(编译classpath、测试classpath、运行classpath)。

maven有以下几种依赖关系:

compile:编译依赖范围,默认使用这种范围,这种范围的依赖对编译、测试、运行三种classpath都有效。例如,spring-core这个包在编译、测试、运行的时候都需要这个依赖,应该使用compile。

test:测试依赖范围,只对于测试classpath有效,例如junit只有在编译测试代码和运行测试代码的时候需要。

provided:已提供依赖范围,对于编译classpath、测试classpath有效,对于运行classpath无效,例如servlet-api,编译和测试的时候需要此依赖,运行的时候容器已经提供了,所以不需要重复引用。

runtime:运行时依赖范围,对于测试classpath和运行classpath有效,对编译classpath无效,例如JDBC驱动实现,主代码编译的时候只是使用到JDK提供的JDBC接口,只有测试、运行的时候需要具体的JDBC驱动实现类。

system:系统依赖范围,system与三种classpath的关系与provided是相同的,不同的是,使用system依赖的时候,必须使用systemPath元素显示指定依赖文件的路径,这种依赖方式不是通过maven仓库解析,并且往往与本机系统绑定,可能造成构建的不可移植systemPath可以引用环境变量。

例如:

<scope>system</scope>

<systemPath>${java.home}/lib/rt.jar</systemPath>

import: mavne2.0.9及以上,导入依赖范围,该依赖范围不会对三种classpath产生实际的影响,该种类型是用来导入继承的pom文件的一种方式,这样导入和父模块继承是一样的。

依赖范围不仅控制三种classpath与依赖的关系,还对传递性依赖产生影响,加入A依赖于B,B依赖与C,那么我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖,第一直接依赖的范围和第二直接依赖的范围,决定了传递依赖的范围,下图第一列表示第一直接依赖,第一行表示第二直接依赖,中间交叉表示传递性依赖范围,none代表不传递:

                          compile           test           provided         runtime

 compile     compile           none         none               runtime

 test            test                  none         none               test

 provided   provided          none         provided        provided

 runtime     runtime            none         none              runtime

maven依赖调解,当A->B->C->X(1.0),A->D->X(2.0),A传递依赖了X的两个版本的构件,这个时候,两个版本都解析式不对的会jar包冲突,所以必须选择一个,maven依赖调解的第一原则是:路径最近者优先,例如,X(1.0)的路径长度为3,X(2.0)的路径长度为2,所以依赖引入X(2.0),maven依赖调解的第二原则是:第一声明者优先(路径长度相同时),当A->B->Y(1.0),A->C->Y(2.0)两个版本Y的依赖路径长度是一样的,那么如果B的依赖声明在C之前,那么Y(1.0)会被解析使用。

<scope>test</scope>

依赖的类型对应项目坐标定义的packageing默认值为jar

<type>jar</type>

标记依赖是否可选,

可选依赖:true为可选,假如一个依赖A实现了使用两种数据库的功能,A->oracla驱动,或者A->mysql驱动,娜美A对于这两种驱动的依赖就是可选的。,可选的依赖只对当前的A有效,不会依赖传递,其他项目依赖A的时候就要显示的声明依赖哪个A的可选依赖,依赖方式和声明A的依赖相同,就是普通的显示依赖。

<optional>true</optional>

标记需要排除的传递依赖,当我们需要使用传递依赖中的某个依赖的指定版本的时候,我们可以排除掉这个传递依赖,由我们指定相应版本的依赖。

<exclusions>

        <exclusion>

          <groupId>org.springframework</groupId>

          <artifactId>spring-context-support</artifactId>

        </exclusion>

        <exclusion>

         <groupId>org.springframework</groupId>

         <artifactId>spring-context</artifactId>

        </exclusion>

  </exclusions>

</dependency>

依赖归类:在实际使用的时候,应该把同一个组织,同一个项目的依赖的版本用maven属性声明变量,在依赖声明中通过maven属性设置版本,这样方便同一类依赖的版本的管理。

依赖优化:

mvn dependency:list:显示项目的已解析依赖和依赖范围

mvn dependency:tree:在上一个基础上显示依赖树,显示传递依赖关系

mvn dependency:analyze:

分析依赖:

Used undeclared dependencies found:展示项目中直接使用未直接定义的

Unused declared dependencies found:显示项目中没有直接使用的但显示声明的依赖,这里只能分析主代码和测试代码使用的,不能分析出jar包中使用的,但是在项目中没有直接使用的依赖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值