maven可以管理项目的依赖,如何找到jar的具体位置,唯一的标识就是坐标。开发过程中需要导入项目所依赖的jar,多个项目之间依赖的管理也有原则。
1.坐标的概念
<groupId>org.sonatype.nexus</groupId> <artifactId>nexus-indexer</artifactId> <version>2.0.0</version> <packaging>jar</packaging>
maven 的所有构件均通过坐标进行组织和管理。maven 的坐标通过 5 个元素进行定义,其中 groupId、artifactId、version 是必须的,packaging 是可选的(默认为jar),classifier 是不能直接定义的。
groupId:定义当前 Maven 项目所属的实际项目,跟 Java 包名类似,通常与域名反向一一对应。
artifactId:定义当前 Maven 项目的一个模块,默认情况下,Maven 生成的构件,其文件名会以 artifactId 开头,如 hibernate-core-3.6.5.Final.jar。
version:定义项目版本。
packaging:定义项目打包方式,如 jar,war,pom,zip ……,默认为 jar。
classifier:定义项目的附属构件,如 hibernate-core-3.6.6.Final-sources.jar,hibernate-core-3.6.6.Final-javadoc.jar,其中 sources 和 javadoc 就是这两个附属构件的 classifier。classifier 不能直接定义,通常由附加的插件帮助生成。
2.依赖
2.1.范围
compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围
test:测试依赖范围。只对测试classpath有效
provided:已提供依赖范围。对于编译和测试classpath有效
runtime:运行时依赖范围。对于测试和运行有效
system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致。
import:导入依赖范围。
2.2传递性依赖
如果A->B->C,即A对于B的依赖范围是compile,B对于C的依赖范围是compile,那么A对于C的依赖范围是compile。此时,我们称A对于B是第一直接依赖,B对于C是第二直接依赖(根据情况的不同可能会有第三、第四……直接依赖),A对于C是传递性依赖。
2.3 依赖调解
1.路径最近者优先
2.最先声明者优先
2.4 可选依赖
可选依赖,依赖将不会得以传递。<optional>true</optional>
2.5 排除依赖
不想引入的依赖,使用代码中用exclusions元素可以包含多个exclusion子元素。
2.6 版本统一管理
<properties>
<springframework.version>3.1.2.RELEASE</springframework.version>
</properties>
3.总结
pom是可以继承的,通常对于一个大型的项目或是多个module的情况,子模块的pom需要指定父模块的pom。利用maven可以高效管理我们的项目。