9.5. 项目关系

使用Maven的引人注目的原因之一是它使得追踪依赖(以及依赖的依赖)的过程非常容易。当一个项目依赖于另一个项目生成的构件,我们就说这个构件是一个依赖。在Java项目的情况下,这可以简单到比如一个项目依赖与外部的如Log4J或JUnit依赖。依赖可以为外部依赖建模,也可以管理一组相关项目的依赖,如果project-a依赖于project-b,Maven就能够很聪明的知道project-b必须在project-a之前构建。

项目关系不仅仅是依赖以及解决一个项目需要能构建出一个构件。Maven可以建模的关系还包括,某个项目是父项目,某个项目是子模块。本节给你项目中各种关系的概览,并且告诉你如何配置这些关系。

9.5.1. 坐标详解

坐标为一个项目定义一个唯一的位置,它们首先在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来引用它。artifactIdgroupId的组合必须是唯一的。换句话说,你不能有两个不同的项目拥有同样的artifactIdgroupId;在某个特定的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倾向于使用这种简短的依赖标志来打印日志信息。