【1】依赖的范围
结论
compile 和 test 对比:
compile 和 provided 对比:
验证
①验证 compile 范围对 main 目录有效
main目录下的类为HelloServlet,compile范围引入的依赖为:pro01-maven-java,pro01-maven-java中的类为:Calculator,我们只需验证main目录下的类为HelloServlet能否使用Calculator即可。只需要通过import将要测试的类引入当前类,引入后如果编译能通过,则说明可用,这个范围的依赖对当前类有效。
我们来编译一下。发现成功了,说明是没有问题的:
②验证test范围对main目录无效
test范围的依赖为junit
junit可以使用的注解为@Test,那还是跟上面一样的原理:
然后编译一下发现编译不能通过:
③验证test和provided范围不参与服务器部署
我们需要验证:通过compile范围依赖的jar包会放入war包,通过test和provided范围依赖的jar包不会放入war包。
然后我们打包一下看一下:
发现只有通过compile范围依赖的jar包会放入war包。
【2】依赖的传递性
结论:
在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。
B 依赖 C 时使用 compile 范围:可以传递
B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。
①compile 范围:可以传递
我们来测试一下:
测试方式:让 pro01-maven-java 工程依赖 spring-core
具体操作:编辑 pro01-maven-java 工程根目录下 pom.xml,加入这个依赖:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> </dependency>
然后使用 mvn dependency:tree
命令查看效果:
我们再来看一下这个依赖的pom文件:
所有当B 依赖 C 时如果使用 compile 范围,那么依赖是可以传递的。
②test 或 provided 范围:不能传递
我们可以看到pro01-maven-java 依赖了 junit,但是在 pro02-maven-web 工程中查看依赖树的时候并没有看到 junit,所以test范围不能传递。
要验证 provided 范围不能传递,可以在 pro01-maven-java 工程中加入 servlet-api 的依赖:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
然后再查看pro02-maven-web 工程的依赖树,发现还是跟原来一样,并没有servlet-api这个依赖。
【3】依赖的排除
依赖排除就是:当 A 依赖 B,B 依赖 C 而且 C 可以传递到 A 的时候,A 不想要 C,需要在 A 里面把 C 排除掉。
依赖的排除目的就是为了避免架包的冲突。(架包的版本可能不一样)
所以配置依赖的排除其实就是阻止某些 jar 包的传递。因为这样的 jar 包传递过来会和其他 jar 包冲突。
我们来举个例子:
我们在 pro02-maven-web 工程中配置对 commons-logging 的排除。
先来看一下配置前的依赖:
配置方式:
<dependency> <groupId>com.atxiaoyu.maven</groupId> <artifactId>pro01-maven-java</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> <!-- 使用excludes标签配置依赖的排除 --> <exclusions> <!-- 在exclude标签中配置一个具体的排除 --> <exclusion> <!-- 指定要排除的依赖的坐标(不需要写version) --> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
配置完成后再来查看一下依赖:
我们可以发现在 spring-core 下面就没有 commons-logging 了。