坐标是maven的核心概念之一,另外几个核心概念是依赖、仓库、生命周期、插件
本文总结一下坐标和依赖的几个要点
“坐标”是maven引入项目构建的概念,此前ant是没有这个概念的。maven将jar包、项目的构建成品等,都统一看做是“构件”,而坐标就是构件的唯一标识。通过坐标,maven就能找到任何一个构件,并且管理依赖关系
坐标由以下元素组成:groupId、artifactId、version、packaging、classifier
groupId,是当前maven项目隶属的实际项目。而不仅仅是到组织层面,因为一个组织往往会有多个实际项目,如果groupId仅仅指向组织,那就无法标识实际项目的模块了。实际项目和maven项目,是一个“一对多”的关系
比如说,我们接下来要做的任务管理重构项目,准备基于maven构建,那这个项目的groupId就应该是com.huawei.wfm.task
artifactId,即当前的maven项目,可以视为实际项目的一个模块,推荐的做法,是用实际项目名称,作为artifact的前缀
比如说,接下来这个任务子系统,有一个模块是流程引擎,那么这个maven项目的aftifactId就应该是task-process
version,就很好理解了,是项目的版本号
packaging,是项目的打包方式,常见的有jar、war等
classifier,是用来帮助定义构建输出的一些附属构建,如javadoc、source等,需要依赖插件,不能直接定义
下面说说“依赖”的一些要点:
1、首先需要知道,maven构建项目的时候,会有3套classpath。编译项目主代码的classpath、编译和执行测试代码的classpath、实际运行时的classpath
2、依赖范围,和上面说的第一点密切相关
maven有以下几种依赖范围,包括compile、test、provided、runtime、system、import
如果在pom中没有特别声明scope的话,默认是compile的依赖范围
3、依赖传递
这个很好理解,比如项目依赖了spring-framework,而spring-framework又是依赖common-logging的,那么项目也就依赖common-logging
要注意的是,依赖传递的概念,需要和上面说的依赖范围一起理解
另一个问题是,在实践中,有时候需要排除传递性依赖。比如说项目A依赖项目B,而项目B依赖项目C的1.0版本。但是项目A希望依赖项目C的2.0版本,这个时候就需要在项目A的pom中显式的声明
<dependencies>
<dependency>
<artifactId>project-b</artifactId>
<exclusions>
<exclusion>
<artifactId>project-c</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<artifactId>project-c</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
4、依赖调解
这里有2个原则:第一个是路径最近者优先,第二个是第一声明者优先