共计 2118 个字符,预计需要花费 6 分钟才能阅读完成。
这又是一个系列,一个要把 Maven 讲透的系列,希望能够对大家有帮助!
前言
看完上一篇《Maven 基础教程之使用入门》后,大家基本上就会使用 Maven 了,但是 Maven 远不止上一篇文章中总结的那么一点东西,还有很多其他非常重要的概念,而这些概念就是我们深入理解 Maven,学习 Maven 原理的重点,从这一篇文章开始,我将开始重点总结 Maven 中的一些重点概念和原理性的东西,通过这些重要的概念和原理性的东西,让大家知其然,也知其所以然。
Maven 坐标是什么?
在初中的数学几何中,我们知道,平面中任何一个坐标都可以唯一标识该平面中的一个点。对于 Maven 世界中,有数量巨大的 JAR 包或者 WAR 包,在还没有坐标这个概念前,我们是如何引入我们项目需要的依赖呢?比如我现在创建了一个 Spring 的项目,此时我就要去 Spring 官网下载 Spring 相关的 JAR 包,放到我的项目 Classpath 下面去;当需要 Mybatis 相关的 JAR 包时,我再去 Mybatis 的官网下载对应的 JAR 包,再放到 Classpath 中去。也就是说,我们缺少什么 JAR 包,就去网上下载对应的 JAR 包,而很多时候,我们只有在编译出现错误时,我们才知道我们到底缺了哪些依赖的 JAR 包,所以这样的工作就让我们很被动,同时又没法进行流程自动化。
问题抛出来了,我们要相信这个世界上大牛的能力,没有解决不了的问题。基于这些难题,Maven 就定义了这样一组规则来搞定它。
世界上任何一个 JAR 包或者 WAR 包都可以使用 Maven 坐标唯一标识,Maven 坐标的元素包括 groupId、artifactId、version 和 classifier 等。只要我们提供了正确的坐标元素,Maven 就能找到对应的 JAR 包或者 WAR 包。
就是这么简单的。所以,在我们开发自己的项目时,Maven 也强制要求我们需要为项目指定适当的坐标,这样其它的 Maven 项目才能引用对应项目生成的 JAR 包或者 WAR 包。
细说 Maven 坐标
Maven 坐标就是定义了一种规则,任何基于 Maven 开发的项目都需要遵守这个规则,也就是需要明确定义自己的坐标,我们可以看一下上一篇文章中 pom.xml 文件里的那个示例:
<groupId>com.jellythink.HelloWorld</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
上面代码中,关于坐标的各个坐标元素,这里重点说明一下:
-
groupId
:定义当前 Maven 项目隶属的实际项目;我们要明白的是 Maven 项目和实际项目不一定是一对一的关系。举一个最常见的例子,比如 Spring Framework 这个实际项目,其对应的 Maven 项目会有很多,如 spring-core、spring-context 等。这是由于 Maven 中模块的概念,因此实际项目往往会被划分成很多模块。当我们看到一个项目的 groupId 时,会觉的很熟悉,为什么?是不是和我们经常定义的 Java 包名很像,这个和我们在 Java 中定义顶级包名的规则是一样的,通常与公司或者组织的域名反向一一对应。 -
artifactId
:该元素定义实际项目中的一个 Maven 项目(模块),一般推荐的做法是使用实际项目名称作为 artifactId 的前缀,比如 spring-core 的前缀是 spring 一样。 -
version
:该元素定义 Maven 项目当前所处的版本;在 Maven 中定义了一整套完整的版本定义规范,后续会有专门的文章进行总结。 -
packaging
:该元素定义 Maven 项目的打包方式;打包方式通常与所编译生成的文件扩展名对应,但也不是绝对的,比如 packaging 为 maven-plugin 的构件扩展名为 jar;packaging 常见的是 jar 和 war 这两种类型;不同的打包方式会影响到构建的生命周期。很多时候,我们也会看到我们没有定义这个 packaging 元素,此时 Maven 会使用默认值 jar。 -
classifier
:该元素用来帮助定义输出一些附属文件。附属输出文件与主输出文件是对应的,比如上面的主输出文件是 hello-world-1.0-SNAPSHOT.jar,该项目可能还会通过使用一些插件生成如 hello-world-1.0-SNAPSHOT-javadoc.jar、hello-world-1.0-SNAPSHOT-sources.jar 这样的一些附属输出文件。需要我们注意的是,不能直接定义项目的 classifier,因为附属输出文件不是项目直接默认生成的,而是由附加的插件帮助生成的。
总结
到这里,关于 Maven 坐标的相关知识就整理完了,回过头来看,你会发现 Maven 中的坐标是一个非常好理解,但是却又非常重要,非常基础的一个概念。不懂这个坐标的概念,可能最后连 pom.xml 文件都看不懂,再往下的学习也就都是白搭,最后,庆幸的是这个还不是很难学习,至少看懂我这里总结的应该木有问题;不过能看懂我这里总结的,也就 OK 了。
2019 年 4 月 3 日,于内蒙古呼和浩特。