Archetype插件通过名字为pom.xml
的文件创建了一个项目。这就是项目对象模型(POM),一个项目的声明性描述。当Maven运行一个目标的时候,每个目标都会访问定义在项目POM里的信息。当jar:jar
目标需要创建一个JAR文件的时候,它通过观察POM来找出这个Jar文件的名字。当compiler:compile
任务编译Java源代码为字节码的时候,它通过观察POM来看是否有编译目标的参数。目标在POM的上下文中运行。目标是我们希望针对项目运行的动作,而项目是通过POM定义的。POM为项目命名,提供了项目的一组唯一标识符(坐标),并且通过依赖
(dependencies) ,父 (parents) 和先决条件 (prerequisite)
来定义和其它项目的关系。POM也可以自定义插件行为,提供项目相关的社区和开发人员的信息。
Maven坐标定义了一组标识,它们可以用来唯一标识一个项目,一个依赖,或者Maven POM里的一个插件。看一下下面的POM。
我们加亮了这个项目的坐标:groupId
,
artifactId
,
version
和packaging
。这些组合的标识符拼成了一个项目的坐标[2]。[2]就像任何其它的坐标系统,一个Maven坐标是一个地址,即“空间”里的某个点:从一般到特殊。当一个项目通过依赖,插件或者父项目引用和另外一个项目关联的时候,Maven通过坐标来精确定位一个项目。Maven坐标通常用冒号来作为分隔符来书写,像这样的格式:groupId:artifactId:packaging:version
。在上面的pom.xml
中,它的坐标可以表示为mavenbook:my-app:jar:1.0-SNAPSHOT
.这个符号也适用于项目依赖,我们的项目依赖JUnit的3.8.1版本,它包含了一个对junit:junit:jar:3.8.1
的依赖。
groupId
-
d 团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个以com.sonatype开头的
groupId
,而Apache Software的项目有以org.apache开头的groupId
。 artifactId
-
在
groupId
下的表示一个单独项目的唯一标识符。 version
-
一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上一个“SNAPSHOT”的标记。
项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部分。一个项目的groupId:artifactId:version
使之成为一个独一无二的项目;你不能同时有一个拥有同样的groupId
,
artifactId
和version
标识的项目。
packaging
-
项目的类型,默认是
jar
,描述了项目打包后的输出。类型为jar
的项目产生一个JAR文件,类型为war
的项目产生一个web应用。
在其它“Maven化”项目构成的巨大空间中,的这四个元素是定位和使用某个特定项目的关键因素。Maven仓库(repositories)(公共的,私有的,和本地的)是通过这些标识符来组织的。当一个项目被安装到本地的Maven仓库,它立刻能被任何其它的项目所使用。而我们所需要做的只是,在其它项目用使用Maven的唯一坐标来加入对这个特定构件的依赖。