Maven 详解
Maven 详解
Author:赵利文
2020-5-19 17:52
Maven概述
简介
Maven是一款基于POM(项目对象模型:Projcet-Object-Model)的项目管理工具。
Maven解决的问题
在没有Maven之前,在做软件项目的开发过程中,会导入一些依赖jar包。如果只有你一个人开发,并且jar包比较少还好说。但是上升到团队开发,不同团队成员开发不同的模块,模块之间还会依赖相同的jar包,而且这些jar包的版本可能每个人使用的还不一样,这样可能会在项目开发和整合的过程中,造成团队代码复用性低、jar包冲突和兼容性等一系列问题。造成项目管理效率低,开发团队协同不顺畅等问题。更有可能,成员之间的沟通就占到了整个工作时间的一半。
基于此,Apache软件基金会开发了用于构建和管理软件全生命周期的Maven。
Maven起到的作用
-
简化你的jar包使用
在pom.xml文件中,配置简单的资源描述信息,由maven自动帮你完成jar包的下载和导入。
-
提高团队协作的效率
极大简化团队的协作过程。通过依赖机制,完成jar包的管理;通过继承机制,解决了版本统一问题。
Maven的安装配置
- 登录官网,下载软件压缩包:https://maven.apache.org/download.cgi
- 下载完之后,将压缩包解压到本地任意磁盘目录:
-
将bin文件夹添加到环境变量:
首先创建MAVEN_HOME变量:
4. 然后创建Path:
格式为:%MAVEN_HOME%\bin
-
验证是否安装成功
如果可以打印出版本信息,代表安装成功:
Maven库
Maven库的概念
使用Maven进行项目管理,其中Maven本身的插件库、项目代码依赖的jar包等都作为资源保存在一个磁盘目录中(远程或本地)。那么可以简单理解为,这些存放资源的物理空间,称之为Maven的库(Repository)。
Maven中包含远程库和本地库。
远程库
保存在远程服务器中的Maven资源库,可以被Maven客户端(开发者)连接并为Maven提供所需资源。
ps:Maven默认使用的远程库叫Maven的*库,由Maven社区维护,将全世界常用的库放置在*库*大家使用。但是普通用户只有读取权限,不可以放置自己的资源。也就是说,人家有哪些资源,你就只能下载哪些资源。而且Maven的*仓库在国外,国内连接下载资源速度太慢。
为了弥补*库的不足,国内有些企业创建了自己的私服作为代理服务器,比如阿里、网易。其中不仅有Maven*库的资源,而且还提供了额外的满足本国开发者常用的资源。这个让我想到了Java中的代理设计模式,通过切面(私服)对切入点(访问资源)进行功能增强。
本地库
如果远程仓库的资源每次创建项目都要重新下载,势必会对网络资源造成浪费,而且下载时间也是对开发时间的占用。所以Maven将下载过的资源存放在本地,下次在获取资源之前会首先检查本地是否存在,如果存在就直接使用本地资源,如果不存在才会去远程仓库下载。
配置Maven仓库
配置本地仓库
打开Maven更目录->conf->settings.xml
在55行的位置,使用<localRepository标签> 配置Maven本地仓库,如下图所示:
配置远程仓库
就像上面所提到的,Maven*仓库比较慢,可以配置国内的私服,提升下载速度:
如图:在<mirrors> 中,我们用阿里的Maven镜像替换原有镜像:
阿里Maven镜像的具体配置内容为:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
Maven的生命周期
万事万物都有生命周期。植物生长的从生到死会经历发芽、生长、开花、结果、枯萎等环节。
Maven作为项目管理工具,负责项目从无到有的每一个环节,这个过程就是Maven的生命周期(Life Circle)。
一个Maven的生命周期包括:创建、编码、编译、测试、打包、安装和发布。
创建
在一个工作空间中创建一个maven项目,命令为:mvn archetype:generate
以上命令会执行构建maven骨架的操作,期间Maven会下载相关依赖jar包,执行到以下这一步,我们会看到Maven为我们提供了10种骨架,默认为我们选择的是第7种:quickstart
我们选择默认,回车下一步。
到这一步,需要输入groupId,代表组织ID,这个一般输入公司域名倒写,因为是演示,我输入我名字拼音到倒写:
artifactId可以理解为模块或项目的名称:
项目版本,不写默认为:1.0-SNAPSHOP
以上三个信息(组ID 、模块名称、模块版本号), 可以唯一确定一个项目的"坐标",也就是项目的标识。
package ,如果不写,默认是groupId:
这样就创建好了一个基于quickstar骨架的java项目:
Maven项目的目录结构
src 目录放置的是项目代码。
-main: 放置源代码
-Java:包和源代码
-resources :放置配置文件,比如springmvc.xml、applicationContext.xml等等
-test:测试代码
-Java:用于测试的包和源代码
-resources:同样是放置配置文件的位置,如果不写,默认读取main目录下resources下的配置文件信息。
target:编译输出路径
pom.xml Maven的核心配置文件,后期依赖的jar包资源就在这里配置,当然还可以配置一些其它参数。
编译
进入刚才我们创建的项目目录,执行 mvn compile ,可以对项目代码进行编译。
我们看到,编译之后,生成了target目录,在上面讲目录结构的时候提到过target目录的作用,这里就不在赘述了:
清除target
target保存了项目的输出文件,一般在调用命令生成target执行之前,先清空这个目录,保证输出的编译文件是最新的,执行命令mvn clean:
ps:我们发现,在执行mvn clean的时候,Maven会下载相关jar,说明maven自身执行的命令也会依赖相关资源,所以在Maven中,一切皆资源。
测试
我们在开发项目的过程中,要进过很重要的代码测试阶段,保证程序的准确性和健壮性。
在maven中为我们提供了测试的命令,而且生成了全面的测试包包,方便开发人员定位问题。
我们将项目的代码故意写错:
执行 mvn test:
会发现maven将编译出错的测试报告进行了输出。
打包
当项目编写完毕,测试完毕,需要将代码打包成jar供别人使用,或者打包成war部署到服务器,需要执行 mvn package命令:
我们在执行打包命令时,还发现maven帮我们执行了测试,如果你觉得测试环节已经没有问题了,不需要浪费测试环节,而且同时执行clean操作,可以通过组合命令:mvn clean package -DskipTests :
安装
如果我项目的某一模块,需要打包成jar包作为资源上传到私服供其他人使用,而且该资源的结构需要满足Maven的规范才能让Maven进行正确的识别和管理。这时就需要进行安装的操作,使资源具备能够让其他人通过Maven正确使用的目录格式。命令格式为:mvn install
发布
执行完安装任务,就可以将资源发布到私服供其它人引用了。因为我这边没有私服地址,所以具体演示就不进行了。
具体发布的命令格式为: mvn deploy
先介绍到这里,后期将补充IEDA集成Maven的方式。以及Maven 的依赖 继承 聚合的概念。敬请期待~