6.1依赖管理
1、依赖传递
依赖传递被分为两种,一种是直接依赖另一种是间接依赖,其中直接依赖表示在当前项目中,通过依赖配置建立的依赖关系,而间接依赖代表被依赖的资源,如果还依赖其他资源,那么当前项目间接依赖其他资源如图所示
直接依赖:在当前项目中,通过依赖配置建立的依赖关系
间接依赖:被依赖的资源,如果还依赖其他资源,那么当前项目间接依赖其他资源
6.2.依赖冲突
依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因此造成类包版本冲突。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
通过查看依赖,我们发现spring-aop和spring-context都依赖了一个叫spring-core的依赖。此时spring-core的版本有两个,这样就产生了依赖冲突
6.2.1.第一声明者优先原则
谁先定义的就用谁的传递依赖:即调换spring-aop和spring-context位置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
6.2.2.路径近者优先原则
直接依赖级别高于传递依赖:即直接引入spring-beans
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
6.2.3.排除依赖
排除依赖:在不影响项目运行的情况下把冲突的依赖排除掉
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
6.2.4.版本锁定
版本锁定:使用dependencyManagement 进行版本锁定
<properties>
<spring-core.version>5.2.0.RELEASE</spring-core.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-core.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
6.3.依赖范围
6.3.1.什么是依赖范围?
依赖的jar包在默认情况下可以在任何范围内使用,可以通过scope标签来控制其作用范围。作用范围如下:
主程序(main的Java目录)
测试程序(test的Java目录)
打包(war包)
6.3.2.测试
1.把spring-context的作用域换成test
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
<scope>test</scope>
</dependency>
2.在main的Java目录中测试
public class Demo {
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("");//报错
}
}
3.在test的Java目录中测试
public class Demo {
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("");//报错
}
}