依赖管理
依赖配置
一句话: 依赖指当前项目运行需要的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















