使用Maven的引人注目的原因之一是它使得追踪依赖(以及依赖的依赖)的过程非常容易。当一个项目依赖于另一个项目生成的构件,我们就说这个构件是一个依赖。在Java项目的情况下,这可以简单到比如一个项目依赖与外部的如Log4J或JUnit依赖。依赖可以为外部依赖建模,也可以管理一组相关项目的依赖,如果project-a
依赖于project-b
,Maven就能够很聪明的知道project-b
必须在project-a
之前构建。
项目关系不仅仅是依赖以及解决一个项目需要能构建出一个构件。Maven可以建模的关系还包括,某个项目是父项目,某个项目是子模块。本节给你项目中各种关系的概览,并且告诉你如何配置这些关系。
坐标为一个项目定义一个唯一的位置,它们首先在Chapter 3, 一个简单的Maven项目中介绍过。项目使用Maven坐标与其它项目关联。一个项目不是简单的依赖于另一个项目,而是一个带有groupId,artifactId,和version的项目依赖于另一个带有groupId,artifactId,和version的项目。回顾一下,Maven坐标有三部分组成:
- groupId
-
一个
groupId
归类了一组相关的构件。组定义符基本上类似于一个Java包名。例如:groupId
org.apache.maven
是所有由Apache Maven项目生成的构件的基本groupId。组定义符在Maven仓库中被翻译成路径,例如,groupId
org.apache.maven
可以在repo1.maven.org的/maven2/org/apache/maven
目录下找到。 - artifactId
-
artifactId
是项目的主要定义符。当你生成一个构件,这个构件将由artifactId
命名。当你引用一个项目,你就需要使用artifactId
来引用它。artifactId
和groupId
的组合必须是唯一的。换句话说,你不能有两个不同的项目拥有同样的artifactId
和groupId
;在某个特定的groupId
下,artifactId
也必须是唯一的。Note
虽然‘.’在
groupId
中很常用,而你应该避免在artifactId
中使用它。因为在解析一个完整限定名字至子模块的时候,这会引发问题。 - version
-
当一个构件发布的时候,它是使用一个版本号发布的。该版本号是一个数字定义符如“1.0”,“1.1.1”,或“1.1.2-alpha-01”。你也可以使用所谓的快照(snapshot)版本。一个快照版是一个处于开发过程中的组件的版本,快照版本号通常以SNAPSHOT结尾;如,“1.0-SNAPSHOT”,“1.1.1-SNAPSHOT”,和“1-SNAPSHOT”。Section 9.3.1, “项目版本”介绍了版本和版本界限。
还有第四个,也是最少用到的限定符:
- classifier
-
如果你要发布同样的代码,但是由于技术原因需要生成两个单独的构件,你就要使用一个分类器(classifier)。例如,如果你想要构建两个单独的构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件,它们有同样的groupId:artifactId:version组合。如果你的项目使用本地扩展类库,你可以使用分类器为每一个目标平台生成一个构件。分类器常用于打包构件的源码,JavaDoc或者二进制集合。
当我们在本书说到依赖的时候,我们通常使用如下的简短标志来描述一个依赖:groupId
:artifactId
:version
。要引用Spring
Framework的2.5版本,我们可以使用org.springframework:spring:2.5
。当你要求Maven使用Maven
Dependency插件打印出依赖列表的时候,你也会看到Maven倾向于使用这种简短的依赖标志来打印日志信息。