目录
Maven
1. 前言
2. 概述
2.1 介绍
2.2 安装
3. IDEA集成Maven
3.1 集成Maven环境
3.2 创建Maven项目
3.3 Maven坐标详解
3.4 导入maven项目
4. 依赖管理
4.1 依赖配置
4.2 依赖传递
4.3 依赖范围
4.4 生命周期
4.5 插件
Maven
1. 前言
1). 什么是Maven?
Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。
官网:Maven – Welcome to Apache Maven
2). Maven的作用是什么?
A. 依赖管理 : 方便快捷的管理项目依赖的资源jar包,避免版本冲突问题。
若没有通过maven进行大型项目的依赖管理,我们在开发项目时,需要引入大量的jar包。 那么此时,jar包和jar包之间很多时候是需要版本匹配的,如果版本不匹配,此时很容易出现版本冲突问题。 引入的依赖jar包如下:
而通过maven进行项目依赖管理,则很方面的可以解决这个问题。 我们只需要在maven项目的pom.xml文件中,配置该项目的依赖坐标即可,它会自动解决依赖的版本冲突问题。 pom.xml中引入的依赖,如下图所示:
B. 统一项目结构 : 提供标准、统一的项目结构。
项目开发中,无论你使用的是早期的eclipse ,还是myeclipse , 还是idea。 若我们创建的是一个maven工程,是可以帮我们自动生成一个统一、标准的项目目录结构。 具体的统一结构如下:
目录说明:
src/main/java: java源代码目录
src/main/resources: 配置文件信息
src/test/java: 测试代码
src/test/resources: 测试配置文件信息
C. 项目构建 : maven提供了标准的、跨平台(Linux、Windows、MacOS)的自动化项目构建方式。
如上图所示我们开发了一套系统,代码需要进行编译、测试、打包、发布,这些操作如果需要反复进行就显得特别麻烦,而Maven提供了一套简单的命令来完成项目构建。
综上所述,Maven是一款管理和构建java项目的工具。
2. 概述
2.1 介绍
2.1.1 什么是maven
1). Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。
2). 官网:Maven – Welcome to Apache Maven
3). 作用:
- 方便的依赖管理
- 统一的项目结构
- 标准的项目构建流程
2.1.2 Maven模型
- 项目对象模型 (Project Object Model)
- 依赖管理模型(Dependency)
- 插件(Plugin)
如上图所示就是Maven的模型,而我们先看紫色框框起来的部分,他就是用来完成 标准化构建流程 。如我们需要编译,Maven提供了一个编译插件供我们使用,我们需要打包,Maven就提供了一个打包插件提供我们使用等。
上图中紫色框起来的部分,项目对象模型就是将我们自己抽象成一个对象模型,有自己专属的坐标,如下图所示是一个Maven项目:
依赖管理模型则是使用坐标来描述当前项目依赖哪儿些第三方jar包,如下图所示:
上述Maven模型图中还有一部分是仓库。如何理解仓库呢?
2.1.3 Maven仓库
大家想想这样的场景,我们创建Maven项目,在项目中使用坐标来指定项目的依赖,那么依赖的jar包到底存储在什么地方呢?其实依赖jar包是存储在我们的本地仓库中。而项目运行时从本地仓库中拿需要的依赖jar包。
仓库:用于存储资源,管理各种jar包。 下图中, 右侧整个虚线框, 框起来的部分都是仓库。
仓库分类:
- 本地仓库:自己计算机上的一个目录。
- 远程仓库(私服):一般由公司团队搭建的私有仓库。
- 中央仓库:由Maven团队维护的全球唯一的。 仓库地址:Central Repository:
当项目中使用坐标引入对应依赖jar包后,首先会查找 本地仓库 中是否有对应的jar包:
- 如果有,则在项目直接引用;
- 如果没有,则去中央仓库中下载对应的jar包到本地仓库。
如果还可以搭建远程仓库(私服),将来jar包的查找顺序则变为: 本地仓库 --> 远程仓库--> 中央仓库
2.2 安装
2.2.1 下载
下载地址:Maven – Download Apache Mavenhttps://maven.apache.org/download.cgi
2.2.2 安装步骤(以3.5.0为例)
1). 解压 apache-maven-3.5.0-bin.zip , 既安装完成
建议解压缩到没有中文、特殊字符的路径下。如解压缩到 F:\apache-maven-3.5.0 下。
解压缩后的目录结构如下:
- bin目录 : 存放的是可执行命令。mvn 命令重点关注。
- conf目录 :存放Maven的配置文件。settings.xml 配置文件后期需要修改。
- lib目录 :存放Maven依赖的jar包。Maven也是使用java开发的,所以它也依赖其他的jar包。
2). 配置本地仓库
修改 conf/settings.xml 中的 <localRepository> 为一个指定目录作为本地仓库,用来存储jar包。
3). 配置阿里云私服
中央仓库在国外,所以下载jar包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的jar包。
修改 conf/settings.xml 中的 <mirrors>标签,为其添加如下子标签:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
注意配置的位置, 在<mirrors> ... </mirrors> 中间添加配置。
4). 配置环境变量 MAVEN_HOME
此电脑 右键 --> 高级系统设置 --> 高级 --> 环境变量
A. 在系统变量处新建一个变量 MAVEN_HOME
B. 在 Path 中进行配置
打开命令提示符进行验证,出现如图所示表示安装成功
mvn -v
3. IDEA集成Maven
3.1 集成Maven环境
我们要想在IDEA中使用Maven进行项目构建,就需要在IDEA中继承Maven。
3.1.1 当前工程设置
1). 选择 IDEA中 File --> Settings --> Build,Execution,Deployment --> Build Tools --> Maven
2). 设置 IDEA 使用本地安装的 Maven,并修改配置文件及本地仓库路径
- Maven home path: 指定当前Maven的安装目录。
- User settings file: 指定当前Maven的settings.xml配置文件的存放路径。
- Local repository: 指定Maven的本地仓库的路径。(如果指定了settings.xml, 这个目录会自动读取出来, 可以不用手动指定)
3). 配置工程的编译版本为8
上述配置的maven环境,只是针对于当前工程的,如果我们再创建一个project,又恢复成默认的配置了。 要解决这个问题, 我们就需要配置全局的maven环境。
3.1.2 全局设置
1). 选择 IDEA中 File --> close project。
2). 打开 settings , 选择 Build,Execution,Deployment --> Build Tools --> Maven
3). 配置工程的编译版本为8
这里所设置的maven的环境信息,并未指定任何一个project,此时设置的信息就属于全局配置信息。 以后,我们再创建project,默认就是使用我们全局配置的信息。
3.2 创建Maven项目
1). 创建模块,选择Maven,点击Next
2). 填写模块名称,坐标信息,点击finish,创建完成
3). 编写 HelloWorld,并运行
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello Maven ...");
}
}
Maven项目的目录结构:
maven-project01
|- src (源代码目录和测试代码目录)
|- main (源代码目录)
|- java (源代码java文件目录)
|- resources (源代码配置文件目录)
|- test (测试代码目录)
|- java (测试代码java目录)
|- resources (测试代码配置文件目录)
|- target (编译、打包生成文件存放目录)
3.3 Maven坐标详解
1). 什么是坐标?
- Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置。
- 使用坐标来定义项目或引入项目中需要的依赖
2). Maven 坐标主要组成
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
- artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
- version:定义当前项目版本号
如下图就是使用坐标表示一个项目:
注意:
- 上面所说的资源可以是插件、依赖、当前项目。
- 我们的项目如果被其他的项目依赖时,也是需要坐标来引入的。
3.4 导入maven项目
1. 打开IDEA,选择右侧Maven面板,点击 + 号,选中对应项目的pom.xml文件,双击即可
2. 如果没有Maven面板,选择 View --> Appearance --> Tool Window Bars
4. 依赖管理
4.1 依赖配置
依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。
比如,在当前工程中,我们需要用到logback来记录日志,此时, 就可以在maven工程的pom.xml文件中,引入logback的依赖。具体步骤如下:
1). 在 pom.xml 中编写 <dependencies> 标签
2). 在 <dependencies> 标签中 使用 <dependency> 引入坐标
3). 定义坐标的 groupId,artifactId,version
<dependencies>
<!-- log4j 日志依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
</dependencies>
4). 点击刷新按钮,引入最新加入的坐标
或者
这样,每一次引入新的依赖,或者修改现有的依赖配置,都需要点击刷新按钮,刷新依赖,在可以加入最新的坐标。
注意事项:
①. 如果引入的依赖,在本地仓库中不存在,将会连接远程仓库 / 中央仓库,然后下载依赖。(这个过程会比较耗时,耐心等待)
②. 如果不知道依赖的坐标信息,可以到mvn的中央仓库(https://mvnrepository.com/)中搜索。
4.2 依赖传递
4.2.1 依赖具有传递性
1). 直接依赖:在当前项目中通过依赖配置建立的依赖关系
2). 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
比如:上图中,projectA 依赖了 projectB , 而projectB 依赖了 projectC 及其他jar包。 那么此时,在projectA中也会将projectC的依赖传递下来。
对于projectA 来说, projectB 就是直接依赖。 而 projectC 就是间接依赖。
4.2.2 排除依赖
A依赖B,B依赖C,如果A不想将C依赖进来,是否可以做到? 在maven项目中,我们可以通过排除依赖来实现。
排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本。
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven-projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依赖, 主动断开依赖的资源-->
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
4.3 依赖范围
依赖的jar包,默认情况下,可以在任何地方使用。可以通过 <scope> … </scope> 设置其作用范围。
作用范围:
1). 主程序范围有效。(main文件夹范围内)
2). 测试程序范围有效。(test文件夹范围内)
3). 是否参与打包运行。(package指令范围内)
如下图所示给 junit 依赖通过 scope 标签指定依赖的作用范围。 那么这个依赖就只能作用在测试环境,其他环境下不能使用。
scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
compile(默认) | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc驱动 |
4.4 生命周期
4.4.1 介绍
Maven的生命周期就是为了对所有的构建过程进行抽象和统一。 描述了一次项目构建,经历哪些阶段。
Maven对项目构建的生命周期划分为3套:
- clean:清理工作。
- default:核心工作,如:编译、测试、打包、安装、部署等。
- site:生成报告、发布站点等。
具体三套生命周期又包含哪些具体的阶段呢, 我们来看下面这幅图:
我们看到这三套生命周期,里面有很多很多的阶段,那么这么多生命周期,其实我们常用的并不多,主要关注以下几个:
• clean:移除上一次构建生成的文件
• compile:编译项目源代码
• test:使用合适的单元测试框架运行测试(junit)
• package:将编译后的文件打包,如:jar、war等
• install:安装项目到本地仓库
而这些生命周期阶段呢,在IDEA中右侧的maven工具栏中,可以很方便的展示出来。
而生命周期的顺序是:clean --> validate --> compile --> test --> package --> verify --> install --> site --> deploy 。我们需要关注的就是:clean --> compile --> test --> package --> install 。
而这些生命周期,我们在执行后面的生命周期时,前面的生命周期都会执行。
4.4.2 执行
执行指定生命周期的两种方式:
1). 在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行。
2). 在命令行中,通过命令执行。
4.5 插件
4.5.1 介绍
- Maven 本质上是一个插件执行框架,所有工作都是由插件完成。
- 默认maven在各个生命周期上都绑定有预设的插件,在执行到对应生命周期时执行对应的插件功能。
4.5.2 跳过测试
可以在pom.xml中通过maven插件配置,自定义其他功能。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
通过配置插件的形式,可以实现跳过单元测试的功能。 而在IDEA中其实还给我们提供了一个简洁操作。将执行的 闪电按钮 点击一下,就可以跳过单元测试了。