写给初学者的Maven教程——05依赖管理

上一篇:写给初学者的Maven教程——04Maven坐标讲解
下一篇:写给初学者的Maven教程——06Maven创建web项目

一.scope依赖范围

在讲解scope范围之前我们不得不讲一下依赖关系,在Maven中存在三种依赖关系:依赖和编译,测试,运行的classpath的关系

有些依赖(就是我们的jar包)只用于测试,比如junit;有些依赖编译用不到,只有运行的时候才能用到,比如mysql的驱动包在编译期就用不到(编译期用的是JDBC接口),而是在运行时用到的;还有些依赖,编译期要用到,而运行期不需要提供,因为有些容器已经提供了,比如servlet-api在tomcat中已经提供了,我们只需要的是编译期提供而已。那么在<dependency>中还引入了<scope>,它主要管理依赖的部署。大致有compile、provided、runtime、test、几个取值

写给初学者的Maven教程——05依赖管理

compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效.
test:测试依赖范围。只对于测试classpath有效.
provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
runtime:运行时提供。例如:jdbc驱动

通过对上面这些值的配置可以指定我们的依赖jar包的作用范围(重点掌握前三个),其中compile是默认值。当然我相信讲了这么多你可能还是一脸懵逼,没关系,接下来我会在后面讲解例子。

二.依赖传递

首先了解直接依赖间接依赖。前面我们创建了testtest2两个工程,其中test2依赖与test,这就是直接依赖,现在我们假设有了第三个项目test3,他依赖test2,那么我们可以称之为test3直接依赖于test2,间接依赖于test。接下来我们先讲讲scopecompiletest时的效果。

比如在test2里面配置了Junit依赖,他的scope为compile(默认的可以不配置),那么在test3里面配置了test2的依赖,那么test3就可以不用配置Junit依赖了。如果范围是test那就需要配置Junit依赖。provided与runtime用的比较少这里就不讲解了。

三.依赖冲突

假如test1使用junit4.10依赖,并且scope是compile,那test2,test3都可以使用test1的junit4.10,因为传递下来了。假如test2使用junit4.9依赖,那test3会用junit4.9,这是一个就近的原则。

四.可选依赖

可选依赖是通过下面的这个<optional>标签来实现的,取值为truefalse,true表示不可以向下传递依赖,false表示可以向下传递依赖。(这里一定要注意这个可以不可以
写给初学者的Maven教程——05依赖管理

五.排除依赖

在test3中排除test的依赖
写给初学者的Maven教程——05依赖管理
上一篇:写给初学者的Maven教程——04Maven坐标讲解
下一篇:写给初学者的Maven教程——06Maven创建web项目