今天我们来介绍一个在Java开发中非常重要的工具——Maven。如果你是一名Java开发者,那么你一定不会对Maven感到陌生。但是,对于一些新手来说,可能还不太了解Maven是什么,它有什么作用,以及如何使用它。接下来,就让我们一起来深入了解一下Maven吧!
## 一、maven简介
### Maven是什么
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。maven是基于Ant 的构建工具,Ant 有的功能Maven 都有,额外添加了其他功能。
Maven提供了一套标准化的项目结构,所有IDE使用Maven构建的项目结构完全一样,所有IDE创建的Maven项目可以通用。
Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
- 提供了一套标准化的项目结构
- 提供了一套标准化的构建流程(编译、测试、打包、发布 …)
- 提供了一套依赖管理机制
### Maven作用
项目构建管理:maven提供一套对项目生命周期管理的标准,开发人员、和测试人员统一使用maven进行项目构建。项目生命周期管理:编译、测试、打包、部署、运行。
- 管理依赖(jar包):maven能够帮我们统一管理项目开发中需要的jar包。
- 管理插件:maven能够帮我们统一管理项目开发过程中需要的插件。
## 二、maven仓库
用过maven的同学,都知道maven可以通过pom.xml中的配置,就能够获取到想要的jar包,但是这些jar是在哪里呢?就是我们从哪里获取到的这些jar包?答案就是仓库。
仓库分为:本地仓库、第三方仓库(私服)和中央仓库。
### 1、本地仓库
本地仓库:计算机中一个文件夹,自己定义是哪个文件夹。Maven会将工程中依赖的构件(Jar包)从远程下载到本机的该目录下进行管理。
maven默认的仓库是$user.home/.m2/repository目录。
本地仓库的位置可以在$MAVEN_HOME/conf/setting.xml文件中修改。
```
在文件中找到localRepository目录,修改对应内容即可
<localRepository>D:/maven/r2/myrepository</localRepository>
```
### 2、中央仓库
中央仓库:网上地址https://repo1.maven.org/maven2/
这个公共仓库是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目构件。工程依赖的jar包如果本地仓库没有,默认从中央仓库下载。
由于maven的中央仓库在国外,所以下载速度比较慢,所以需要配置国内的镜像地址。
在配置文件中找到mirror标签,添加以下内容即可。
```
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
```
### 3、第三方仓库(私服)
第三方仓库,又称为内部中心仓库,也称为私服。
私服:一般是由公司自己设立的,只为本公司内部共享使用。它既可以作为公司内部构件协作和存档,也可作为公用类库镜像缓存,减少在外部访问和下载的频率,公司单独开发的私有jar可放置到私服中。(使用私服为了减少对中央仓库的访问)
>注意:连接私服,需要单独配置。如果没有配置私服,默认不使用
## 三、Maven的坐标
什么是坐标?
Maven中的坐标是资源的唯一标识,使用坐标来定义项目或引入项目中需要的依赖。
![image.png](https://static.golangjob.cn/231208/8cc62b122100aa40a054e1057e851844.png)
Maven坐标的主要组成:
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.baidu)
- artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
- version:定义当前项目版本号
>你还在苦恼找不到真正免费的编程学习平台吗?可以试试云端源想!课程视频、在线书籍、在线编程、实验场景模拟、一对一咨询……你想要的全部学习资源这里都有,重点是统统免费![点这里即可查看](https://ydcode.cn/memberIndex?sourceId=417)
## 四、Maven的三套生命周期
### 什么是生命周期
在Maven出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理,编译,测试及部署。虽然大家都在不停地做构建工作,但公司和公司间,项目和项目间,往往使用不同的方式做类似的工作。
![image.png](https://static.golangjob.cn/231208/6e33dec9b6497b662a5cf8893dffea4a.png)
Maven的生命周期就是为了对所有的构建过程进行抽象和统一。Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完美的,易扩展的生命周期。
这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤。
Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际工作,在Maven的设计中,实际任务(如源代码编译)都交由插件来完成。
### Maven的三套生命周期
Maven拥有三套相互独立的生命周期,分别是clean,default和site。
![image.png](https://static.golangjob.cn/231208/dc910a6a6d773550c597eba1570bf3d4.png)
#### clean生命周期
- clean生命周期的目的是清理项目,它包含三个阶段:
- pre-clean 执行一些清理前需要完成的工作
- clean 清理上一次构建生成的文件
- post-clean 执行一些清理后需要完成的工作
#### default生命周期
- default生命周期定义了真正构建项目需要执行的所有步骤,它是所有生命周期中最核心的部分。其中的重要阶段如下:
- compile :编译项目的源码,一般来说编译的是src/main/java目录下的java文件至项目输出的主classpath目录中
- test :使用单元测试框架运行测试,测试代码不会被打包或部署
- package :接收编译好的代码,打包成可以发布的格式,如jar和war
- install:将包安装到本地仓库,供其他maven项目使用
- deploy :将最终的包复制到远程仓库,供其他开发人员或maven项目使用
#### site生命周期
site生命周期的目的是建立和发布项目站点,maven能够基于pom文件所包含的项目信息,自动生成一个友好站点,方便团队交流和发布项目信息。该生命周期中最重要的阶段如下:
- site :生成项目站点文档
- Maven生命周期相关命令
- mvn clean:调用clean生命周期的clean阶段,清理上一次构建项目生成的文件
- mvn compile :编译src/main/java中的java代码
- mvn test :编译并运行了test中内容
- mvn package:将项目打包成可发布的文件,如jar或者war包;
- mvn install :发布项目到本地仓库
### Maven生命周期相关插件
Maven的核心包只有几兆大小,核心包中仅仅定义了抽象的生命周期。生命周期的各个阶段都是由插件完成的,它会在需要的时候下载并使用插件,例如我们在执行mvn compile命令时实际是在调用Maven的compile插件来编译。
我们使用IDEA创建maven项目后,就不需要再手动输入maven的命令来构建maven的生命周期了。IDEA给每个maven构建项目生命周期各个阶段都提供了图形化界面的操作方式。
具体操作如下:
- 打开Maven视图:依次打开Tool Windows–>Maven Projects
- 执行命令:双击Lifecycle下的相关命令图标即可执行对应的命令(或者点击运行按钮)
![image.png](https://static.golangjob.cn/231208/37bed1ee6d84ee9c176cdc48f08e1ad9.png)
## 五、maven的版本规范
maven使用如下几个要素来唯一定位某一个jar:
- Group ID:公司名。公司域名倒着写
- Artifact ID:项目名
- Version:版本
发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。maven在版本管理时候可以使用几个特殊的字符串SNAPSHOT,LATEST ,RELEASE。比如"1.0-SNAPSHOT"。
各个部分的含义和处理逻辑如下说明:
SNAPSHOT 正在开发中的项目可以用一个特殊的标识,这种标识给版本加上一个"SNAPSHOT"的标记。
LATEST 指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个snapshot版,具体看哪个时间最后。
RELEASE 指最后一个发布版。
## 六、maven项目之间的关系
### 依赖关系
- 标签把另一个项目的jar引入到当过前项目
- 自动下载另一个项目所依赖的其他项目
![image.png](https://static.golangjob.cn/231208/99e8d40fbeb8eace0b02afe75c59a356.png)
### 继承关系
- 父项目是pom类型,子项目jar 或war,如果子项目还是其他项目的父项目,子项目也是pom 类型。
- 有继承关系后,子项目中出现标签
- 如果子项目和和与父项目相同,在子项目中可以不配置和父项目pom.xml 中是看不到有哪些子项目,在逻辑上具有父子项目关系。
```
父项目
<groupId>cn.zanezz.cn</groupId>
<artifactId>demoparent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
子项目
<parent>
<artifactId>demoparent</artifactId>
<groupId>cn.zanezz.cn</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<artifactId>child2</artifactId>
```
### 聚合关系
- 前提是继承关系,父项目会把子项目包含到父项目中。
- 子项目的类型必须是Maven Module 而不是maven project
- 新建聚合项目的子项目时,点击父项目右键新建Maven Module
```
子项目中的pom.xml
<parent>
<artifactId>demoparent</artifactId>
<groupId>cn.zanezz.cn</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的pom.xml
<groupId>cn.zanezz.cn</groupId>
<artifactId>demoparent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>child1</module>
<module>child2</module>
</modules>
```
### 聚合项目和继承项目区别
- 在语意上聚合项目父项目和子项目关系性较强;
- 在语意上单纯继承项目父项目和子项目关系性较弱。
Maven是一个非常强大的工具,它可以帮助我们更好地管理和构建Java项目。如果你是Java开发者,那么你一定不能错过这个工具。希望这篇文章能帮助你更好地理解和使用Maven,祝你在Java开发的道路上越走越远!
有疑问加站长微信联系(非本文作者))