Maven(二)之依赖管理
Maven(二)之依赖管理
一、依赖的配置
<dependencies>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<classifier></classifier>
<scope>provided</scope>
<type></type>
<optional></optional>
<exclusions>
<exclusion>
<artifactId></artifactId>
<groupId></groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
- groupId 公司名称
- artifactId 模块名称
- version:版本号
- classifier:用来定义构建输出的一些附属构建
-
scope:依赖范围,有以下值
1)compile,默认值,适用于所有阶段,会随着项目一起发布。
2)provided,编译和测试的有用,在运行时无效,如servlet-api,在编译和测试的时候需要依赖,但是运行时,容器已经提供,所以不需要再次引入
3)runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
4)test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
5)system,类似provided,需要再使用systemPath元素显示制定依赖文件路径,如下。(由于绑定本地文件,在其他计算机不一定存在,所以尽量不要使用) - type:依赖类型,对应项目坐标定义的packaging,默认不用声明,为jar
-
optional:标记依赖是否可选,有true和false。如A依赖于B,但是B只是A在测试时使用,这个时候X依赖于A,那么A就不需要B,那么在A的pom中配置optional为true的话,则在x编译的时候会忽略B的依赖。
true:其他引入A时会忽略依赖B
false:为默认,会传递依赖B - exclusions:用来排除传递性依赖。比如,我们的项目A中引入了第三方构件B,但是B中又引入了C和D,但是D对于我们的项目有冲突那么我们可以配置如下,将D这个依赖忽略
<exclusion>
<artifactId>D</artifactId>
<groupId>D</groupId>
</exclusion>
2.依赖传递性
依赖范围 | compile | test | runtime | 例如 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | - | Y | - | JUnit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动实现 |
system | Y | Y | - | 本地的,Maven仓库以外的文件 |
如果我们在项目中配置一个依赖,但是这个依赖又有很多依赖,这样我们项目中就会存在许多不必要的jar,maven依赖传递性机制可以很好的解决这个问题。
如果A依赖B,我们叫第一直接依赖,B依赖C我们叫第二直接依赖,它们的依赖范围会随传递性产生变化。
由上面可以知道,如果A依赖于B,范围为test,B依赖于C,范围为compile,那么C是A范围为test的传递性依赖
3.依赖调解原则
1、第一声明者优先原则 :maven 自动按照,在 pom 文件定义依赖,先声明的依赖为准。
如下由于 spring-webmvc 在前边以 spring-webmvc 依赖的 spring-beans-4.2.4 为准,所以最终 spring-beans-4.2.4添加到了工程中。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
2、路径近者优先原则
例如:还是上述情况,spring-contex 和 spring-webmvc 都会传递过来 spirng-beans,那如果直接把 spring-beans 的依赖直接写到 pom 文件中,那么项目就不会再使用其他依赖传递来的 spring-beans,因为自己直接在 pom 中定义 spring-beans 要比其他依赖传递过来的路径要近。
在本工程中的pom中加入 spirng-beans-5.0.2 的依赖,根据路径近者优先原则,系统将导入 spirng-beans-5.0.2:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
4.依赖的排除
snapshot–快照版和release–正式版
如果项目A依赖第三方依赖B,B又依赖SNAPSHOT版C那么C的不稳定会影响到A,这个时候就需要排除掉C。还有就是一个传递性依赖在*仓库中对应的版本不存在,我们就需要排除依赖,然后再导入存在版本的依赖
<dependency>
<groupId>com.ys.b</groupId>
<artifactId>pro-b</artifactId>
<version>1.0.1</version>
<!--排除依赖-->
<exclusions>
<exclusion>
<groupId>com.ys.c</groupId>
<artifactId>pro-c</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入正确依赖 -->
<dependency>
<groupId>com.ys.c</groupId>
<artifactId>pro-c</artifactId>
<version>1.0.0</version>
</dependency>
5锁定依赖
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。
如下的配置是锁定了 spring-beans 和 spring-context 的版本:
dependencyManagement>
<dependencies>
<!--这里锁定版本为4.2.4 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
6.归并依赖
还可以把版本号提取出来,使用<properties>
标签设置成变量。
在使用时,通过el表达式引用版本
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<!--在此引用版本号-->
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<!--在此引用版本号-->
<version>${spring.version}</version>
</dependency>
</dependencies>
7、可选依赖
如果A依赖B
B中有如下依赖C
通过配置,optional为true,那么A中就不会依赖这个C
<dependency>
<groupId>com.my.C</groupId>
<artifactId>cpt</artifactId>
<version>1.0.0</version>
<optional>true</optional>
</dependency>
上一篇: Apollo 安装部署
下一篇: Linux Nvidia显卡驱动安装