尽量用简洁的语言介绍maven依赖,不求覆盖全,但求最简短的语言覆盖最多依赖相关知识。本文可能不适合初学者,如果你使用过一段时间想更好的理解依赖,那么本文你可以参考下。
一、坐标
首先介绍下maven坐标。在maven的世界中,其坐标能唯一确定一依赖。
groupId:是项目创建团体或组织的唯一标志符,通常是域名倒写,如groupId org.apache.maven.plugins就是为所有maven插件预留的。
artifactId:是项目artifact唯一的基地址名,实际项目中的一个项目(模块)。
version:该构件所处的版本
<span style="font-size:14px;"><groupId>test</groupId> --是项目创建团体或组织的唯一标志符,通常是域名倒写
<artifactId>test</artifactId> --是项目artifact唯一的基地址名,实际项目中的一个项目(模块)。
<version>4.8.2</version> --
<packaging>jar</packaging> --打包的方式,如jar、war、ear等等。默认为jar。</span>
在<dependency>中前三个属性唯一确定你想要的依赖。同理,在你的pom文件中project根目录下声明这四个元素表明来定义你项目的唯一坐标,以便其他项目饮用。
二、依赖范围
<span style="font-size:14px;"><span style="font-size:12px;"><dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
</dependencies></span></span>
上述配置中scope表示依赖范围,依赖范围有如下几种:compile:编译依赖范围。在编译,测试,运行阶段都有效。
test:测试依赖范围。只在测试阶段有效。
provided:已提供的依赖范围。在编译和测试阶段有效。运行时无效。比如servlet-api容器已经提供,不需重复引用。
runtime:运行依赖范围。只在测试和运行阶段有效,比如jdbc驱动实现。
system:系统已提供。使用必须显示通过指定systemPath配置依赖文件地址。
注意:依赖具有传递性。也就是项目a依赖b,b依赖c,这时候项目a中会自动依赖c。但由于依赖有作用范围,当由传递行引入的依赖与第一引用依赖范围不一致时依赖范围会怎样呢?下表格表示了不同依赖范围时的结果:(第一依赖表示b,第二依赖表示c,-表示依赖不会得以传递)
第一直接依赖\第二直接依赖
|
compile
|
test
|
provided
|
runtime
|
---|---|---|---|---|
compile | compile | - | privode | runtime |
test | test | - | - | test |
provided | provided | - | provided | - |
runtime | runtime | - | - | runtime |
三、依赖调解
上面的举例的依赖路径可以表示为a→b→c,当项目中有两个路径同时志向c,maven依赖调解第一原则是:路径最短优先。路径相同第二原则是:第一声明优先。
maven可以通过在pom文件中配置<exclusions><exclusion>来排除依赖。
mvn dependency:list 展示已解析依赖。
mvn dependency:tree 展示依赖树形关系。
mvn dependency:analyze 分析依赖,可找到用到但没有显示引用的和引用了但没有适用的(第二点只是从编译和测试的角度看,而真正运行期用到的监测不到)。