题目
Maven 坐标的含义
答案
```xml <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13-BETA</version> ``` Maven 给我们制定了一套规则 —— 使用坐标进行**唯一标识**。Maven 的坐标元素包括 groupId、artifactId、version、packaging、classfier 。 只要我们提供正确的坐标元素,Maven 就能找到对应的构件,首先去你的本地仓库查找,没有的话再去远程仓库下载。如果没有配置远程仓库,会默认从中央仓库地址下载 在我们自己开发项目的时候,也是要给我们的项目定义坐标的,这是强制性要求,只有这样,其他项目才能引用该项目的构件。 - **groupId**:定义当前 Maven 项目隶属的实际项目。首先,Maven 项目和实际项目不一定是一对一的关系。比如 Spring FrameWork 这一实际项目,其对应的 Maven 项目会有很多,如 `spring-core`、`spring-context` 等。这是由于 Maven 中模块的概念,因此,一个实际项目往往会被划分成很多模块。其次,groupId 不应该对应项目隶属的组织或公司。原因很简单,一个组织下会有很多实际项目,如果 groupId 只定义到组织级别,而后面我们会看到,artifactId 只能定义 Maven 项目(模块),那么实际项目这个层次将难以定义。最后,groupId 的表示方式与 Java 包名的表达方式类似,通常与域名反向一一对应。上例中,groupId 为 `junit` ,是不是感觉很特殊,这样也是可以的,因为全世界就这么个 junit ,它也没有很多分支。 - **artifactId** :该元素定义当前实际项目中的一个 Maven 项目(模块)。推荐的做法是使用实际项目名称作为 artifactId 的前缀。比如上例中的 junit ,junit 就是实际的项目名称,方便而且直观。在默认情况下,Maven 生成的构件,会以 artifactId 作为文件头。例如 `junit-3.8.1.jar` ,使用实际项目名称作为前缀,就能方便的从本地仓库找到某个项目的构件。 - **version** :该元素定义了使用构件的版本。如上例中 junit 的版本是 `4.13-BETA` ,你也可以改为 `4.1.2` 表示使用 `4.1.2` 版本的 junit 。 - **packaging** :定义 Maven 项目打包的方式,使用构件的什么包。打包方式通常与所生成构件的文件扩展名对应。如上例中没有 `packaging` ,则默认为 jar 包,最终的文件名为`junit-4.13-BETA.jar` 。当然,也可以打包成 war 等。 - **classifier** :该元素用来帮助定义构建输出的一些附件。附属构件与主构件对应。如上例中的主构件为 `junit-4.13-BETA.jar` ,该项目可能还会通过一些插件生成如 `junit-4.13-BETA-javadoc.jar`、`junit-4.13-BETA-sources.jar`,这样附属构件也就拥有了自己唯一的坐标。 上述 5 个元素中: - `groupId`、`artifactId`、`version` 是必须定义的。 - `packaging` 是可选的(默认为 jar )。 - 而 `classfier` 是不能直接定义的,需要结合插件使用。 **Maven 版本规则** Maven 主要是这样定义版本规则的:`<主版本>.<次版本>.<增量版本>` 。比如说 `1.2.3` ,主版本是 1 ,次版本是 2 ,增量版本是 3 。 - 主版本,一般来说代表了项目的重大的架构变更,比如说 Maven 1 和 Maven 2 ,在架构上已经两样了,将来的 Maven 3 和 Maven 2 也会有很大的变化。 - 次版本,一般代表了一些功能的增加或变化,但没有架构的变化,比如说Nexus 1.3 较之于 Nexus 1.2 来说,增加了一系列新的或者改进的功能(仓库镜像支持,改进的仓库管理界面等等),但从大的架构上来说,1.3 和 1.2 没什么区别。 - 增量版本,一般是一些小的 bug fix ,不会有重大的功能变化。