依赖冲突
特殊优先
- 特殊优先∶当同级配置了相同资源的不同版本,后配置的覆盖先配置的(提醒:要尽量避免这种没有意义的冲突)
- 修改D:\java_projects\maven_A\pom.xml, 引入mysql5.1
<?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>
<!-- 引入mysql5.1.43 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
</dependencies>
</project>
- 根据特殊优先原则: maven_A 生效的是mysql5.1.43
- 测试完后,注销到引入mysql5.1.43 , 这里是为了验证.
可选依赖
一句话: 可选依赖指对外隐藏当前所依赖的资源- 不透明
举例说明
- 需求: 隐藏maven_D 项目的junit 依赖,不让其他项目来使用
- 修改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>
<!-- 解读
1. option 默认是false , 即不隐藏
2. option 设置为true , 即隐藏-->
<optional>true</optional>
</dependency>
</dependencies>
</project>
- 刷新maven 管理器,看maven_A 的变化
- 测试完毕后,别忘了恢复原来状态.
排除依赖
一句话: 排除依赖指主动断开依赖的资源, 被排除的资源无需指定版本- 不需要
举例说明
- 需求: maven_A 项目主动排除maven_D 的junit4.13.2 这个依赖
- 修改D:\java_projects\maven_D\pom.xml
<!-- 引入maven_D -->
<dependency>
<groupId>com.wyx</groupId>
<artifactId>maven_D</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除junit-->
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
- 刷新maven 管理器,看maven_A 的变化, 仍然是拿不到junti4.13.2, 提示: 再通过HelloTest.java 来验证实际使用的junit 版本, 更加清晰了.
可选依赖和排除依赖区别
一句话: 隐藏依赖是不让其他项目来引用(我不给), 排除依赖是主动不要引入的某个资源(我不要)
依赖范围
作用范围
一句话: 依赖的jar 默认情况可以在任何地方使用, 通过scope 标签设定其作用范围
举例说明
● 作用范围说明
- 主程序范围有效(src/main 文件夹范围内)
- 测试程序范围有效(src/test 文件夹范围内)
- 是否参与打包(package 指令范围内)
- compile(默认,在主程序、测试代码、打包都有效)
● 作用范围一览图
解读
- 某个引入的jar 包作用范围是程序员根据,业务的实际需要来设置的,不要认为是固定的。
- 比如log4j jar 包,在主程序,测试代码,打包都是需要的, 因此作用范围应当设置为complie
- junit 只是测试代码需要,因此作用范围设置为test 合适,但是如果程序员认为在主程序和打包就是要junit, 仍然可以设置为默认compile
- 比如servlet-api 是tomcat 自己带的,当把程序打包放到生产环境时,用生产环境tomcat 的servlet-api 即可,所以设置为provided 合适,这样就放在servlet-api 版本冲突.
- 比如jdbc, 是第三方的jar , 打包放在生产环境,就应当在自己的包提供jdbc 驱动包,否则程序会因为少驱动包,运行失败
● 看一个案例, 体会依赖范围的特点.
<?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>
<!-- 解读
1. option 默认是false , 即不隐藏
2. option 设置为true , 即隐藏-->
<optional>false</optional>
<!-- scope 设置为test, 让他在test 范围有效-->
<scope>test</scope>
</dependency>
</dependencies>
</project>
- 创建D:\java_projects\maven_D\src\test\java\T2.java, 在test 范围正常使用
import org.junit.Test;
public class T2 {
@Test
public void f1(){
}
}
- 创建D:\java_projects\maven_D\src\main\java\T1.java, 在主程序中,报错
- 修改D:\java_projects\maven_D\pom.xml, 发现主程序和测试程序都可以使用了.
<optional>false</optional>
<!-- scope 设置为test, 让他在test范围有效, 默认就是compile,可以不设置-->
<scope>compile</scope>
- 运行maven web 项目