依赖管理
依赖配置
一句话: 依赖指当前项目运行需要的jar,一个项目可以设置多个依赖
依赖的举例
<!-- 解读:
1. 这里就是引入项目需要的jar 包, 类似传统的import jar 的作用
2. 在dependencies 标签内,可以指定多个需要依赖的jar/导入的jar
3. 引入的jar 包需要一个完整的jar 包坐标,从mvn 仓库查询即可得到-->
<dependencies>
<!-- 引入的一个具体的依赖jar, 包括一个完整的依赖坐标-->
<dependency>
<!-- 依赖的gruopid: 组织名-->
<groupId>junit</groupId>
<!-- 依赖的项目名-->
<artifactId>junit</artifactId>
<!-- 依赖的版本-->
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
依赖传递
直接依赖
一句话: 在当前项目中通过依赖配置建立的依赖关系
举例说明
- 创建maven_A java 项目
- 在maven_A 项目中引入mysql5.1.47 , 这时我们就说maven_A 项目直接依赖mysql5.1.47jar
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
- 如图
间接依赖
一句话: 当前项目直接依赖资源(比如m1), 而m1 又依赖资源(m2),我们就说当前项目间接依赖资源(m2)
举例说明
- 创建maven_B java 模块(为了好理解,我们放在一个项目中)
- 修改D:\java_projects\maven_B\pom.xml , 引入junit4.12
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
- 修改D:\java_projects\maven_A\pom.xml , 引入maven_B
<dependencies>
<!-- 引入maven_B -->
<dependency>
<groupId>com.wyx</groupId>
<artifactId>maven_B</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
- 观察maven_A 和maven_B 的依赖情况
依赖冲突
路径优先
- 路径优先∶当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 示意图说明:
- 解释项目A 依赖情况
- 如果1 度资源有junit 4.1 , 而2 度资源有junit4.2
- 根据路径优先原则, 项目A 生效的是junit4.1
- 举例说明.
- 创建maven_C(为了方便观察,仍然放在一个项目中), 创建方式和maven_B 类似,就不截图了
- 修改D:\java_projects\maven_C\pom.xml, 引入junit4.13
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
- 修改D:\java_projects\maven_B\pom.xml, 引入maven_C
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wyx</groupId>
<artifactId>maven_B</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 引入maven_C -->
<dependency>
<groupId>com.wyx</groupId>
<artifactId>maven_C</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
- 刷新工程,看看maven_A 生效的就是路径优先的maven_B 的junit4.12
- 为了验证是哪个junit 生效了, 还可以通过代码来验证, 写一段代码D:\java_projects\maven_A\src\main\java\HelloTest.java
声明优先
- 声明优先∶当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
- 示意图说明:
图解项目A 依赖情况
- 如果1 度(灰框)资源有junit 4.1 , 而1 度(蓝框)资源有junit4.2
- 根据声明优先原则, 要看项目A , 在pom.xml 引入的顺序,先引入的就是生效的
- 举例说明.
- 创建maven_D(为了方便观察,仍然放在一个项目中), 创建方式和maven_B 类似,就不截图了
- 修改D:\java_projects\maven_D\pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wyx</groupId>
<artifactId>maven_D</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
</project>
- 修改D:\java_projects\maven_A\pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wyx</groupId>
<artifactId>maven_A</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 引入maven_D -->
<dependency>
<groupId>com.wyx</groupId>
<artifactId>maven_D</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 引入maven_B -->
<dependency>
<groupId>com.wyx</groupId>
<artifactId>maven_B</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
</project>
- 为了验证是junit4.13.2 生效还是junit4.12 生效, 写一段代码D:\java_projects\maven_A\src\main\java\HelloTest.java