一. 初始Maven
什么是Maven?
-
Maven是Apache旗下的一个开源项目,是一款用于管理和构建Java项目的工具,它由纯Java语言开发!
-
Apache 软件基金会,成立于 1999 年 7 月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。
Maven的作用:使用Maven能够做什么呢?
- 依赖管理
- 统一的项目结构
- 项目构建(标准化的项目构建流程)
作用一. 依赖管理:
方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题
- 项目当中依赖的资源,只要指的是jar包,通过Maven还可以避免依赖jar包的冲突问题。
- 如果我们要使用Maven这款工具来管理依赖,我们只需要创建一个Maven工程,在这个工程当中,是不需要导入任何jar包的,你要用哪个jar包,只需要在Maven工程的pom.xml这个配置文件当中,来配置这么一块儿描述信息即可。当我们把这块儿信息配置完毕之后,Maven会自动联网下载对应的依赖,然后我们在项目当中就可以直接使用了。如果我们要升级依赖的版本,只需要更改一下这个version,然后刷新一下即可。
- 有了Maven之后我们不用再手动导入jar包了,我们只需要再配置文件当中简单描述一下我们所需要的这个依赖的信息,Maven就会自动联网下载。
- 当使用maven进行项目依赖(jar包)管理,我们就可以避免依赖jar包的冲突问题,我们只需要在maven项目的pom.xml文件中,添加一段如下图所示的配置即可实现。
作用二. 统一项目结构:
提供标准、统一的项目结构
- Java项目的开发工具非常多,比如早期的Eclipse,MyEclipse,以及现在最流行的IDEA,这些开发工具它所构建出来的Java项目目录结构其实是有所差异的,这就导致了一个问题,Eclipse它所创建的Java工程不能直接导入到IDEA当中,IDEA创建的Java工程不能直接导入到Eclipse当中
- 在项目开发中,当你使用不同的开发工具 (如:Eclipse、Idea),创建项目工程时:
- 那如果使用了Maven,这一问题将会得到完美的解决,因为Maven给我们提供了一套标准的项目结构,也就是说不管你用哪款开发工具,你只要使用Maven这款项目构建工具,那么生成出来的目录结构都是统一的
- 那这样呢,不论你用哪款开发工具创建这个Maven项目,在其他的开发工具当中都可以将这个Maven工程直接导入进来,所有的开发工具都是通用的。
- 若我们创建的是一个maven工程,是可以帮我们自动生成统一、标准的项目目录结构:
- 基于Maven创建出来的标准目录结构,每一个目录下都存放的是什么样的内容呢?
- Maven创建出来的工程当中src下,有两个子目录,一个是main,一个是test,main下存放的是项目的实际资源,test下存放的是项目的测试资源。
- 而main以及test下面又有两个目录,一个是java,一个是resources,java下面存放的就是Java的源代码,而resources下面存放的就是配置文件。
- test下面的java和resources存放的都是测试相关的源代码以及测试相关的配置文件。
- 下面还有一份比较核心的配置文件,叫pom.xml,这个是Maven工程的核心配置文件,当前工程所需要导入的依赖的信息,都需要在这份核心配置文件当中来配置。
作用三:标准化的项目构建流程
- 在Maven当中提供了一套跨平台标准的项目构建方式
- 我们所开发的这个Java项目要运行,首先要通过javac来进行编译,我们现在使用的像IDEA这样的高级开发工具,在运行之前,它已经自动的将编译这一步操作帮我们做了,如果没有这样的高级开发工具,就需要先进行编译。
如上图所示我们开发了一套系统,代码需要进行编译、测试、打包、发布,这些操作如果需要反复进行就显得特别麻烦,而Maven将这一系列的操作都进行了标准化,制作了一套标准的构建流程,提供了一套简单的命令来完成项目构建。
- 假如要对Maven工程进行编译,我们只需要点击右侧的Maven面板,双击compile指令,此时这个Maven工程就会自动的进行编译,并且将编译后的文件放在了一个目录target,这个目录下,classes下存放的就是编译后的class字节码文件。
- 双击package这个指令,此时Maven就会自动的对项目进行打包,并且将打包好的jar包也放在target这个目录下,而且像compile,package这些常用的指令,在Windows系统上是支持的,在Mac系统上,在Linux系统上也是支持的,所以它还是跨平台的。
综上所述,可以得到一个结论:Maven是一款管理和构建java项目的工具。
二. Maven概述
- Apache Maven是一个项目管理和构建工具,它基于项目对象模型(Project Object Model , 简 称: POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。
Maven的作用:
- 方便的依赖管理
- 统一的项目结构
- 标准的项目构建流程
- 项目对象模型 (Project Object Model)
- 依赖管理模型(Dependency)
- 构建生命周期/阶段(Build lifecycle & phases)
1). 构建生命周期/阶段(Build lifecycle & phases)
- 以上图中紫色框起来的部分,Maven构建项目生命周期的各个阶段,就是用来完成标准化构建流程 。当我们需要编译,Maven提供了一个编译插件供我们使用;当我们需要打包,Maven就提供了一个打包插件供我们使用等。
- Maven构建项目生命周期的各个阶段:通过Maven当中提供的各种各样的插件,我们就可以完成对应的功能,比如我们通过编译插件就可以对项目进行编译,通过测试插件进行项目的测试,通过打包插件进行项目的打包等等,通过这些插件就可以完成Maven项目标准化的构建,而在执行这些构建操作的时候,不同的阶段又会有不同的文件产生,比如编译阶段就会有编译后的字节码文件产生,再比如打包阶段就会有打包后的JAR文件产生,这些文件都放放在了target这个目录下,那这是Maven的第一部分,通过提供的各种各样的插件来完成项目的标准化构建。
- 以上图中紫色框起来的部分属于项目对象模型,项目对象模型是指在Maven当中可以通过pom.xml当中配置的一小段信息来描述这个Maven工程,就是将我们自己的项目抽象成一个对象模型,有自己专属的坐标,这一块描述信息当中包括当前这个Maven工程归属的组织,当前Maven工程的模块名称以及它的版本,这三项信息我们称之为Maven的坐标,通过这个坐标我们就可以唯一的来标识以及定位一个项目。
- Maven项目对象模型中,每个项目都有一个唯一的项目ID,该ID可以用于在项目之间进行唯一的定位和管理。
- 如下图所示是一个Maven项目:
- 坐标,就是资源(jar包)的唯一标识,通过坐标可以定位到所需资源(jar包)位置。
3). 依赖管理模型(Dependency)
- 以上图中紫色框起来的部分属于依赖管理模型,是使用坐标来描述当前项目依赖哪些第三方jar包
- 如果说在我们当前的这个Maven工程当中,还需要依赖一些其他的资源,我们就可以在pom.xml配置文件当中,来添加依赖管理模型Dependency,通过dependency这个标签来指定需要的这个依赖的坐标,当我们添加了这个依赖的坐标之后,那么此时Maven它就会自动的从仓库当中去查找这个依赖。
2.3 Maven仓库
- Maven工程在运行的时候它关联的就是仓库中的jar包。
- Maven的仓库它是用来存储资源,管理各种jar包的。
Maven仓库分为:
- 本地仓库:自己计算机上的一个目录(用来存储jar包),本地仓库在安装Maven的时候是可以自己去指定的
- 中央仓库:由Maven核心团队维护的,是全球唯一的。在中央仓库当中基本上包含了全世界所有对外发布的这些jar包,仓库地址:Central Repository: (maven.org)https://repo1.maven.org/maven2/
- 远程仓库(私服):一般由公司团队搭建的私有仓库
问题:当我们去添加一个依赖之后,它是怎么去查找这个依赖的呢?到底到本地仓库查找,还是到中央仓库去查找?
- 它是有查找顺序的,首先先会到本地仓库查找,如果本地仓库当中有这个jar包,直接关联本地仓库的jar包就可以,如果本地仓库当中没有,接下来它会连接中央仓库,从中央仓库当中把这个jar包下载下来,然后再关联本地仓库当中的这个jar包,这是中央仓库。
我们刚才提到,中央仓库它是全球唯一的,我们本地仓库连接中央仓库,是要连接国外的网站的,这个过程是比较慢的,那为了提高下载jar包的速度,我们可以再引入第三种仓库,叫远程仓库也叫私服,而这个私服呢,一般是公司团队自己搭建的一个私有仓库
那有了私服之后呢,那有了私服呢,查找jar包的顺序又发生变化了
- 举例,我们在pom.xml配置文件当中我们又去引入了一个B依赖,那么此时它要查找本地仓库是否存在这个jar包,如果本地仓库没有,那它会连接私服,如果私服当中还没有,它会连接中央仓库,再从中央仓库当中把这个jar包下载到私服,然后再将这个jar包下载到本地仓库,然后关联本地仓库的jar包就可以。
而这个私服在企业当中,可不是我们自己一个人去连接,那有可能整个公司的开发团队都在连接整个私服,那此时只要有一个同事用到了整个jar包,那整个jar包它就会从中央仓库下载到私服,那其他同时就不用再每一次都连接到中央仓库了,因为我们连接私服的速度还是比较快的。这个私服当前阶段我们还不会自己去搭建,在接下来安装Maven的时候,我们会使用一个阿里云的私服来提高jar包的下载速度。
2.4 Maven安装
- 下载地址:https://maven.apache.org/download.cgi
- Maven的安装比较简单,因为它是一个绿色版的软件,官方给我们提供Maven的安装包,就是这样的一个zip包,将其存放在没有中文不带空格的目录下
2.4.2 安装步骤
Maven安装配置步骤:
- 解压安装 apache-maven-3.6.1-bin.zip
- 配置本地仓库:修改 conf/settings.xml 中的 <localRepository> 为一个指定目录。
- 配置阿里云私服:修改 conf/settings.xml 中的 <mirrors>标签,为其添加子标签
- 配置Maven环境变量: MAVEN_HOME 为maven的解压目录,并将其bin目录加入PATH环境变量。
- 在我们本地电脑上,有一个目录,这个目录下就是来存放我们从中央仓库所下载下来的一些jar包,那这个仓库呢就是本地仓库,所以我们需要配置一下本地仓库的目录。
- 配置阿里云私服目的是为了提高jar包的下载速度,因为从中央仓库下载jar包要连接国外的网站,速度相对比较慢一些,所以我们配置一个阿里云的私服来提高下载速度。
- 配置环境变量是为了将来在任意目录下都能够执行Maven的指令
1、解压 apache-maven-3.6.1-bin.zip(解压即安装)
解压缩后的目录结构如下:
- bin目录:存放的是可执行文件,我们在后面要用到Maven当中的一些指令,比如我们要进行项目的编译,测试,打包,那其实都要去执行Maven当中的指令,那运行呢就是mvn这个指令。
- conf目录:下存放的是Maven的配置文件,配置Maven的本地仓库以及Maven阿里云的私服,那就需要在settings.xml配置文件当中来配置。
- lib目录:下存放的就是Maven它所依赖的一些jar包资源,因为Maven它是基于Java语言开发的,所以它也依赖其他的jar包
- 第二步配置本地仓库,配置本地仓库就是来指定一个目录,让这个目录作为Maven的本地仓库来存储我们所下载下来的一些资源,那这个资源主要指的就是jar包。
- 连接中央仓库下载jar包就会放在这个目录下
2). 复制标签,粘贴到注释的外面,复制之前新建的用来存储jar包的路径,替换掉标签体内容
- 第三步:配置阿里云的私服来加速jar包的下载速度
-
由于中央仓库在国外,所以下载 jar 包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的jar 包。
- 使用超级记事本软件,打开settings.xml文件,定位到160行左右
- 在标签下为其添加子标签,内容如下:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
配置完如下图所示:
注: 只可配置一个(另一个要注释!) ,不然两个可能发生冲突,导致jar包无法下载!!!!!!!
4、配置环境变量
- 要想在任意目录下都能够执行Maven的指令,那我们就需要配置环境变量
-
Maven 环境变量的配置类似于 JDK 环境变量配置一样
这就代表我们要将Maven安装目录下的bin目录加入到Path环境变量
加入到Path环境变量之后,接下来我们就能够在任意目录下都能去运行Maven的指令。
5、验证Maven是否安装,配置成功:mvn -v
- Maven要想成功的运行,它是要依赖于JDK的环境的,这里用到的JDK版本为11,我们需要下载并安装JDK11并且成功配置Path环境变量
- Java程序中最基本的组成单位是类
下载并安装JDK11并且配置Path环境变量:
1. Path环境变量的作用:
2. 配置Path环境变量步骤如下:
新建Java_HOME变量:
编辑Path变量:
配置完如下图:
检查JDK是否配置成功?
三. IDEA集成Maven
- 我们要想在IDEA中使用Maven进行项目构建,就需要在IDEA中集成Maven
3.1 在IDEA当中配置Maven的环境
方案一:配置当前工程的Maven环境
2、设置IDEA使用本地安装的Maven,并修改配置文件及本地仓库路径
- Maven home path :指定当前Maven的安装目录
- User settings file :指定当前Maven的settings.xml配置文件的存放路径
- Local repository :指 定Maven的本地仓库的路径 (如果指定了settings.xml, 这个目
录会自动读取出来, 可以不用手动指定)
- 上述配置的maven环境,只是针对于当前工程的,如果我们再创建一个project,又恢复成默认的配置了。 要解决这个问题, 我们就需要配置全局的maven环境。
3.1.2 方案二:全局设置
3、配置工程的编译版本为11 Maven默认使用的编译版本为5(版本过低)
- 这里所设置的maven的环境信息,并未指定任何一个project,此时设置的信息就属于全局配置信息以后,我们再创建project,默认就是使用我们全局配置的信息。
3.2 Maven项目
2、创建模块,选择Maven,点击Next
3、填写模块名称,坐标信息,点击finish,创建完成
- Maven的坐标:组织名,模块名,模块项目版本号
4、在Maven工程下,创建HelloWorld类
- 编写的Java代码要放在Java目录下
- test目录下没有resources是因为test下面的resources不常用,所以Maven在创建的时候这个文件夹并没有被创建出来,如果需要,可以右键new一个Directory手动创建一个。
- 编译后会多出一个文件夹叫target,target里面存放的就是我们Java代码编译后产生的字节码文件。
3.2.2 POM配置详解
- 使用pom.xml文件来实现
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- POM模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 当前项目坐标 -->
<groupId>com.itheima</groupId>
<artifactId>maven_project1</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包方式 -->
<packaging>jar</packaging>
</project>
- pom文件的根标签,表示当前maven项目
- 声明项目描述遵循哪一个POM模型版本
- 虽然模型本身的版本很少改变,但它仍然是必不可少的。目前POM模型版本是4.0.0
- 定位项目在本地仓库中的位置,由以上三个标签组成一个坐标
- maven项目的打包方式,通常设置为jar或war(默认值:jar)
- Maven中的坐标是资源的唯一标识 , 通过该坐标可以唯一定位资源位置
- 使用坐标来定义项目或引入项目中需要的依赖
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
- artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
- version:定义当前项目版本号
如下图就是使用坐标表示一个项目:
3.3 导入Maven项目
方式2:使用idea导入模块项目
找到要导入工程的pom.xml