看完上一篇《 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开发的项目都需要遵守这个规则,也就是需要明确定义自己的坐标,我们可以看一下上一篇文章中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日,于内蒙古呼和浩特。