Maven初学习
摘要:本篇笔记记录了我在初学Maven是认为比较重要的一些知识点。
文章目录
1.Maven简介
我们可以把Maven理解成一个具备自身生态的项目管理工具,它的功能就主要体现在两点上:项目和管理,Maven的开发团队找到了一种更好的更方便的项目管理思想并将其规范化,最终形成一种规范供我们使用,只要我们使用这种规范,就可以很好的构建我们的项目。Maven还提出了一种叫做Maven仓库的概念,在Maven仓库中保存着大量的实用的jar包,如连接SQL Server的驱动,连接zookeeper的驱动等等应有尽有,在Maven项目中,我们可以通过书写配置文件的方式实现该项目中的各种jar包的配置,使用配置文件的方式可以有效降低项目在管理和交接中的成本,因为该项目中使用到的所有外部支持,都在配置文件中一览无遗并且可以通过修改配置文件进行灵活的改动。
在Maven中,使用配置文件下载的外部支持都是来源于Maven仓库的,我们如何来理解这个过程呢?我们可以将项目的构建理解成做菜,而我们需要的一些基础功能就像是做菜的原材料,比如我们想要连接MySQL数据库,在早期,我们就需要手写连接规范,然后再书写具体对MySQL进行操作的程序,这里就相当于我们导出购买原材料,都买好之后,才能开始做菜,这里书写连接程序就是购买原材料的过程,而后来出现了各种各样的jar包,也就是官方的或者是个人书写受认可程度高的专业驱动,这些jar包就像是料理包一样,我们直接下载并导入,就可以连接MySQL了,不需要自己在手写,这里就相当于我们想做一道宫保鸡丁,而我们如今无需再到处买菜奔波,只买一个料理包就可以开始做了。那Maven是干什么的呢?Maven就是一个卖料理包的超市,它专卖料理包,我们只需按照它的购买规则,把这个料理包的细节按照它指定的规则说一下,它就会给你一个相对应的料理包,这无疑更加方便了。因为即使有了官方的jar包,这些资源也是零散的存在于互联网上的,一个大项目可能会需要各种各样的jar包,也可以理解为一大桌子酒席需要各种各样的菜,这时我们就需要准备各种各样的料理包,可能上十个,在没有料理包专卖店的时候,我们就需要四处奔波,因为可能有的超市有宫保鸡丁的料理包,没有麻婆豆腐的料理包,同理,我们在构建一个大项目的时候需要各种各样的jar包,就需要天南地北的去下载,有些居心叵测的网站还要收费,但是现在我们有了Maven,Maven仓库中专门收集了各种各样的jar包,我们只要在这一个地方找就可以了,同时Maven仓库还提供了配置文件的jar下载规范,我们只要按规范书写就可以获取所有正确的jar包,这无疑相当于现实生活中出现了一个专门卖料理包的超市,它里边集合了天南地北的各种菜系的料理包,同时还不需要你亲自逛,你只要按照它的规范,提交一份你自己需要的菜单,就能直接获得你需要的所有的料理包,这无疑是非常方便的。
与此同时Maven还提供项目构建的功能,在项目的完成过程中,需要进行多个机械化的环节,如编译,运行单元测试,生成文档,打包和部署,这些工作并不那么具备创造性,都是根据已有的东西生成相应的东西的机械操作,在早期这些操作都是需要手动完成的,实际上即使是现在也有相当数量的公司手动完成这些功能,而Maven中就提供了自动完成这些事情的功能。
1.1.项目构建
构建是每一个程序员都在做的工作,我们可以理解为从写代码到项目部署完成中的所有工作。除了编写代码以外,程序员每天都有相当一部分时间花在了编译,运行单元测试,生成文档,打包和部署等繁琐和不起眼的工作上,这些工作往往是机械化的,这些工作就是构建,在上文中也提到了,这些工作如果使用手工完成的那么其代价就太高了,为了节省时间,有些人便书写了项目构建软件,将这些工作完全自动化,只需要一条简单的命令,所有的繁琐步骤就可以自动的完成,下面我们介绍几种项目构建的工具:
Ant
最早的构建工具,基于IDE,诞生于2000年左右,当时最流行的Java构建工具,它的xml脚本编写风格让xml文件特别大,但是对工程构建过程中的过程控制的特别好。由于其xml文件编写方式并不很方便,目前很少有公司还是用这个古老的工具,只有一些传统的公司或者公司内部的古董项目中还在使用。
Maven
Maven是一个项目管理和整合工具,Maven为开发者提供了一套完整的生命周期框架,开发团队几乎不用花多长时间就能够自动完成工程的基础构建配置(这里就是通过Maven仓库下载环境)。它填补了Ant的缺点,Maven第一次支持了从网上下载的功能,仍然采用xml作为配置文件格式,Maven专注项目依赖,使用Java编写。
Gradle
属于结合以上两个的优势的产物,继承了Ant的灵活和Maven的生命周期管理,它最终被Google作为了Android的御用管理工具。它最大的区别是不用xml作为配置文件格式,而是采用了DSL格式,使得脚本更加简洁。
目前市面上的Ant比较老,所以一般是一些比较传统的软件企业公司在使用;Maven使用Java编写,是当下大多数互联网公司使用的一种构建工具,中文文档也比较齐全;Gradle是使用groovy编写,属于比较新的构建工具一些初创互联网公司在使用,以后会有很大的使用空间。
1.2.总结
现在我们可以理解Maven实际上是一种帮助项目构建的工具,其主要作用就是对项目进行一个规范的管理,进而让程序员能够更方便的对这个项目进行构建,Maven本质上是帮助项目构建的项目管理工具。Maven和其他的构建工具不同之处在于其可以使用Maven仓库在项目构建之初的环境构建迅速下载项目所需要的各种外部支持,因此我们可以将Maven理解问有两个部分:Maven仓库和Maven命令,其中Maven仓库就是帮助我们下载jar包的料理包超市,而Maven命令则专注于项目开发过程中的各种构建操作,如打包,生成文档,部署等。
2.Maven的四大特征
2.1.依赖管理系统
Maven为Java世界引入了一个新的依赖管理系统,以前我们想要导入jar包就需要下载然后使用编译器导入这个jar包,现在我们有了一个升级改造的模式,我们现在只需要在配置文件中引入不同的jar包,就可以从Maven仓库中进行下载,在Maven中,配置文件里的jar包引用,我们就称之为依赖,如图所示:
其中的dependency的意思就是依赖,在一个大型项目中可能会存在很多这样的依赖,这些依赖的地址全都来源于Maven的仓库,我们也可以将依赖称之为坐标,每个依赖中的小项,组成了准确定位一个jar包位置的坐标,如上图中的groupId,artifactId和version三个项就确定了一个jar包的位置,因此我们也称之为坐标。Maven坐标为各个组件引入了新秩序,任何一个组件都必须明确自己的坐标。简而言之每个坐标都可以准确定位一个组件,我们使用这个坐标自然就能找到并下载组件了。接下来我们详细介绍坐标中的每个“分量”。
groupId
定义当前Maven项目隶属的实际项目-公司名称,上图中org.apache
部分就是相应的公司名称,而后边的zookeeper
则是项目组的名称,这里的含义就是阿帕奇公司的zookeeper项目组。在项目开发中,很多模块都是分组开发的,一个项目中,会分出很多组,每个组会去着重实现项目的一个特定功能,因此在这里,groupId中会精确到组名或者模块名。比如Spring是一个实际的项目,其对应的Maven模块会有很多,如Spring-core,Spring-webmvc等。
artifactId
该元素定义实际项目中的Maven模块的项目名称,推荐做法是使用实际项目名称作为atrifactId的前缀,如Spring-bean,Spring-webmvc等,上图中的实际项目名称就是zookeeper,因此我们在那里填的是zookeeper。
version
版本号,这个坐标不难理解,就是这个组件的开发版本,每个版本都会修改一些bug,都会有一些改动。
采用一来管理的好处是能够大大减少我们对jar包下载和管理的难度,比如项目当中如果有100个jar包,难道我们需要从网上下载这100个jar包吗?很明显,我们如果利用Maven提供的坐标,就可以很快完成项目的构建。
2.2.多模块构建
在实际开发过程中,为了提升开发速度,我们写过接口文档,进而进行前后端分离开发,有了接口文档,前端就可以根据接口文档写前端,后端可以根据接口文档写后端。其中前端的书写并不困难,但是后端相应的业务处理非常复杂,非常难写,如数据库交互,网页爬取,接受和返回数据等,为了方便项目的管理与开发,让前后端分离进而简化每个模块的开发,我们通常会进行分层,其中前后交互层我们通常称之为Controller层,业务处理我们称之为Serve层,数据库交互我们成为Dao层或者mapper层,在设计项目的时候分出这些层,进而让前后端分离,就是所谓的多模块设计,在实现这些层不同的功能时,整个项目也是要分组的,由于Maven的仓库坐标中本身就支持组名划分,因此Maven本身在构建的时候也支持这个功能,因此我们在根据分层而进行分组的时候,就可以为每个组按层命名,并且使用Maven构建中的这个分组功能,为每个组的最终成功加前缀,如controller组的jar包就是controller.[jar包名称],dao组的jar包名称就是dao.[jar包名称]…,这样我们就可以依赖于Maven进行一个多模块设计了,从人员到最终的产品命名都非常的合理。
2.3.一致的项目结构
我们使用eclipse上写的项目导入IDEA中时,就会出现各种奇怪的问题,这是因为不同的IDE使用的目录结构不同,在eclipse上有属于自己的目录结构,在IDEA中也有自己的目录结构,当一个项目在不同的IDE上进行开发时就会出现这种问题。Maven在设计之初的理念就是Conversion over configuration(约定大于配置),Maven中指定了一套项目目录结构作为标准的Java项目结构,也就是说不同IDE中的目录结构都可以通过Maven转化为Maven标准的目录结构,或者可以直接创建一个Maven目录结构,这样都使用同样的Maven目录结构,就可以实现一个项目在不同的IDE中打开了,此所谓约定大于配置,Maven的约定优先于不同IDE的自身配置。
2.4.一致的构建模型和插件机制
Maven还为我们提供了一个东西叫做插件。在我们使用eclipse写servlet项目时,首先需要导入tomcat,因为这个项目的运行也是依赖tomcat,在tomcat上运行的,tomcat不同于jar包,它属于插件,我们通常在创建项目的时候,首先要配置它并将其导入进项目,IDE通过某种手段,会将项目导入到中间件的运行区,并且激发插件中的开始机制,让整个项目运行起来,jar包是在项目内的,而插件往往是项目外的。以前我们写项目的时候,通常是需要导入这些插件,但是如今我们有了Maven,可以直接使用配置文件进行配置,并将插件导入到我们的项目中,而无需使用IDE的偏好设置进行复杂的手动配置,在Maven中提供了一套机制来保证插件的引入以及运行,进而通过相应的Maven命令来灵活的构建整个项目,同时在Maven中不仅仅有这些必要的插件,还有一些帮助我们进行快速开发的一些锦上添花的插件,如自动补全插件,异常提示插件,都可以使用Maven灵活的下载并引入,无序手动引入,下面给出一个插件引入的例子,这个例子是轻量型服务器框架jetty的引入,其本质和tomcat一样,都是服务器框架,属于插件,它们使用如下方式引入:
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.8.v20150217</version>
<configuration>
<httpConnector>
<port>80</port>
</httpConnector>
<stopKey>shutdown</stopKey>
<stopPort>9966</stopPort>
</configuration>
</plugin>
</plugins>
插件的引入和jar包的引入是不同的,通过配置信息可以很明显的看出来。
以上就是Maven的初学基本知识。