Maven快速入门

1. Maven 简介

Maven 是 Apache 旗下的一个开源项目,它基于项目对象模型(Project Object Model , 简称: POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。是一款用于管理和构建 Java 项目的工具
官网:Maven – Welcome to Apache Maven

Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。
开源项目:Welcome to The Apache Software Foundation!

2. Maven 的作用

2.1 方便的依赖管理

  • 方便的依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题。

若没有通过 Maven 进行大型项目的依赖管理,我们在开发项目时,需要引入大量的 jar 包,jar 包和 jar 包之间很多时候是需要版本匹配的,很容易出现版本冲突问题。当使用 Maven 进行项目依赖(jar包)管理,则可以很方便地解决这个问题。 我们只需要在 Maven 项目的 pom.xml 文件中,修改配置即可实现。

2.2 统一的项目结构

  • 统一的项目结构:提供标准、统一的项目结构。

在项目开发中,当使用不同的开发工具 (如:Eclipse、IDEA),创建项目工程时,项目目录结构是不一样的,若我们创建的是一个 Maven 工程,可以帮我们自动生成统一、标准的项目目录结构:

在这里插入图片描述

2.3 标准的项目构建流程

  • 标准的项目构建流程:标准跨平台(Linux、Windows、MacOS)的自动化项目构建方式。

我们开发了一套系统,代码需要进行编译、测试、打包、发布,这些操作如果需要反复进行就显得特别麻烦,而 Maven 提供了一套简单的命令来完成项目构建。

3. Maven 模型

Maven 由以下三个部分组成:

在这里插入图片描述

  • 项目对象模型 (Project Object Model):将我们自己的项目抽象成一个对象模型,有自己专属的坐标。

坐标:就是资源(jar包)的唯一标识,通过坐标可以定位到所需资源(jar包)位置

  • 依赖管理模型(Dependency):使用坐标来描述当前项目依赖哪些第三方jar包。

在这里插入图片描述

  • 构建生命周期/阶段(Build lifecycle & phases):用来完成标准化构建流程 。当我们需要编译,Maven提供了一个编译插件供我们使用;当我们需要打包,Maven就提供了一个打包插件供我们使用等。

4. Maven 仓库

之前我们项目中需要 jar 包时,直接就把 jar 包复制到项目下的 lib 目录,而现在书写在 pom.xml 文件中的坐标又是怎么能找到所要的 jar 包文件的呢?
Maven 仓库:用于存储资源,管理各种 jar 包

仓库的本质就是一个目录(文件夹),这个目录被用来存储开发中所有依赖就是(jar 包)和插件

Maven仓库分为:

  • 本地仓库:自己计算机上的一个目录(用来存储jar包)
  • 中央仓库:由 Maven 团队维护的全球唯一的。仓库地址:Central Repository: (maven.org)
  • 远程仓库(私服):一般由公司团队搭建的私有仓库

当项目中使用坐标引入对应依赖 jar 包后,首先会查找本地仓库中是否有对应的 jar 包

  • 如果有,则在项目直接引用
  • 如果没有,则去中央仓库中下载对应的 jar 包到本地仓库

如果搭建远程仓库(私服),jar 包的查找顺序则变为: 本地仓库 --> 远程仓库–> 中央仓库

5. Maven 安装和配置

下载地址:Maven – Download Apache Maven

  1. 直接解压到没有中文、特殊字符的路径下。

解压后的目录结构如下:

在这里插入图片描述

  • bin目录:存放的是可执行命令。(mvn 命令重点关注)
  • conf目录:存放 Maven 的配置文件。(settings.xml配置文件后期需要修改)
  • lib目录:存放 Maven 依赖的jar包。(Maven 也是使用 java 开发的,所以它也依赖其他的 jar 包)
  1. 配置本地仓库:修改 conf/settings.xml 中的 <localRepository> 为一个指定目录,这个目录是将来存放 jar 包的地方。
<localRepository>D:\Develop\Development Tool\mvn-repository</localRepository>  
  1. 配置阿里云私服:由于中央仓库在国外,所以下载jar包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的jar包。修改 conf/settings.xml 中的 <mirrors> 标签,为其添加如下子标签:
<mirrors>
   <!--配置阿里云镜像-->
    <mirror> 
  		<id>alimaven</id> 
  		<name>aliyun maven</name> 
  		<url>http://maven.aliyun.com/nexus/content/groups/public/</url> 
  		<mirrorOf>central</mirrorOf> 
	</mirror> 
</mirrors>

只可配置一个 <mirror> (另一个要注释) ,不然两个可能发生冲突,导致 jar 包无法下载!!!

  1. 配置环境变量:MAVEN_HOME 为 Maven 的解压目录,并将其 bin 目录加入 PATH 环境变量。
    1. 在系统变量处新建一个变量 MAVEN_HOME,值设置为 maven 的解压安装目录
    2. 在 Path 中进行配置,值设置为 %MAVEN_HOME%\bin
    3. 打开 cmd 命令提示符进行验证,输入 mvn -v 显示 Maven 版本则成功

6. IDEA 集成 Maven

  1. 设置 IDEA 使用本地安装的 Maven,并修改配置文件及本地仓库路径

在这里插入图片描述

  1. 配置工程的编译版本和运行版本为 17

在这里插入图片描述

在项目中的设置是针对当前项目的设置,再打开别的项目是无效的,关闭项目在 IDEA 欢迎页面的设置才是全局设置。

7. Maven 项目

  1. 创建空项目

在这里插入图片描述

  1. 创建 Maven 模块

在这里插入图片描述

Maven 项目的目录结构如下:

在这里插入图片描述

Maven 项目的导入有以下两种方式:
通过右侧 Maven 面板或者在 Project Structure 中导入模块,直接选择对应模块的 pom 文件即可。

在这里插入图片描述

8. POM 配置详解

POM (Project Object Model) :指的是项目对象模型,用来描述当前的 Maven 项目。使用 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.baoduo</groupId>  
	<artifactId>maven_project1</artifactId>  
	<version>1.0-SNAPSHOT</version>
    
    <!-- 打包方式 -->
    <packaging>jar</packaging>
</project>
  • <project> :pom 文件的根标签,表示当前 Maven 项目
  • <modelVersion> :声明项目描述遵循哪一个 POM 模型版本,虽然模型本身的版本很少改变,但它仍然是必不可少的。目前 POM 模型版本是4.0.0
  • 坐标 :<groupId><artifactId><version>,定位项目在本地仓库中的位置
  • <packaging> :Maven 项目的打包方式,通常设置为 jar 或 war(默认值:jar)

什么是坐标?

  • Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置
  • 使用坐标来定义项目或引入项目中需要的依赖

Maven坐标主要组成:

  • groupId:定义当前 Maven 项目隶属组织名称(通常是域名反写,例如:com.baoduo)
  • artifactId:定义当前 Maven 项目名称(通常是模块名称,例如 order-service、goods-service)
  • version:定义当前项目版本号

注意:
上面所说的资源可以是插件、依赖、当前项目。我们的项目如果被其他的项目依赖时,也是需要坐标来引入的。

9. 依赖管理

9.1 依赖配置

依赖:指当前项目运行所需要的 jar 包。一个项目中可以引入多个依赖。

  1. 在 pom.xml 中编写<dependencies>标签
  2. <dependencies>标签中使用<dependency>引入坐标
  3. 定义坐标的 <groupId><artifactId><version>
  4. 点击刷新按钮,引入最新加入的坐标,证每一次引入新的依赖,或者修改现有的依赖配置,都可以加入最新的坐标

添加或修改配置之后记得点击这个小按钮刷新。

在这里插入图片描述

如果不知道依赖的坐标信息,可以到Maven Repository: Search/Browse/Explore (mvnrepository.com)中搜索。

还可以使用 IDEA 工具搜索依赖,Alt + Insert 中选择 Dependency 直接搜索需要的依赖。

在这里插入图片描述

如果引入的依赖在本地仓库不存在,将会连接远程仓库/中央仓库,然后下载依赖。(这个过程会比较耗时,耐心等待)

9.2 依赖传递

依赖具有传递性:
直接依赖:在当前项目中通过依赖配置建立的依赖关系
间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

如下图,projectA 依赖了 projectB。对于projectA 来说,projectB 就是直接依赖。而 projectB 依赖了 projectC 及其他 jar 包。 那么此时,在 projectA 中也会将 projectC 的依赖传递下来。对于projectA 来说,projectC就是间接依赖。

在这里插入图片描述

如果 A 依赖 B,B 依赖 C,如果 A 不想将 C 依赖进来,可以使用排除依赖。
排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本。

 <!--排除依赖, 主动断开依赖的资源-->
<exclusions>
	<exclusion>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
	</exclusion>
</exclusions>

9.3 依赖范围

依赖的 jar 包,默认情况下,可以在任何地方使用。可以通过 <scope>…</ scope > 设置其作用范围。

作用范围:

  • 主程序范围有效。(main文件夹范围内)
  • 测试程序范围有效。(test文件夹范围内)
  • 是否参与打包运行。(package指令范围内)

scope 标签的取值范围:

scope主程序测试程序打包(运行)范例
compile(默认)YYYlog4j
test-Y-junit
providedYY-servlet-api
runtime-YYjdbc驱动

9.4 生命周期

Maven 的生命周期就是为了对所有的构建过程进行抽象和统一。 描述了一次项目构建,经历哪些阶段。在 Maven 出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理,编译,测试及部署。虽然大家都在不停地做构建工作,但公司和公司间、项目和项目间,往往使用不同的方式做类似的工作。

Maven 从大量项目和构建工具中学习和反思,总结了一套高度完美的,易扩展的项目构建生命周期。这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤。

Maven 对项目构建的生命周期划分为3套(相互独立):

  • clean:清理工作。
  • default:核心工作。如:编译、测试、打包、安装、部署等。
  • site:生成报告、发布站点等。

每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。这意味着:在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。

在这里插入图片描述

我们看到这三套生命周期,里面有很多很多的阶段,这么多生命周期阶段,其实我们常用的并不多,主要关注以下几个:
• clean:移除上一次构建生成的文件,target 目录会被清除
• compile:编译项目源代码,将 class 字节码文件放在 target 目录下
• test:使用合适的单元测试框架运行测试(junit)
• package:将编译后的文件打包放在 target 目录下,如:jar、war等
• install:安装项目到本地仓库,也就是将打好的 jar 包安装到本地仓库中

在这里插入图片描述

执行指定生命周期的两种方式:

  • 在idea中,右侧的 Maven 工具栏,选中对应的生命周期,双击执行。
  • 在命令行中,通过命令执行。 mvn clean、 mvn compile…

由于在同一套生命周期中,运行后面的阶段时,前面的阶段都会运行。在 IDEA 的 Maven 面板中可以跳过不想执行的阶段。

Maven 的生命周期是抽象的,这意味着生命周期本身不做任何实际工作。在Maven的设计中,实际任务(如源代码编译)都交由插件来完成。
IDEA工具为了方便程序员使用 Maven 生命周期,在右侧的 Maven 工具栏中,已给出快速访问通道。

在这里插入图片描述

10. 附录

10.1 更新依赖索引

有时候给 IDEA 配置完 Maven 仓库信息后,在 IDEA 中依然搜索不到仓库中的 jar 包。这是因为仓库中的 jar 包索引尚未更新到 IDEA 中。这个时候我们就需要更新 IDEA 中 Maven 的索引了,具体做法如下:
打开设置----搜索maven----Repositories----选中本地仓库-----点击Update

在这里插入图片描述

10.2 清理 Maven 仓库

初始情况下,我们的本地仓库是没有任何 jar 包的,此时会从私服去下载(如果没有配置,就直接从中央仓库去下载),可能由于网络的原因,jar 包下载不完全,这些不完整的 jar 包都是以 lastUpdated 结尾。此时,Maven 不会再重新下载,我们需要删除这些以 lastUpdated 结尾的文件,然后 Maven 才会再次自动下载这些 jar 包。

在这里插入图片描述

如果本地仓库中有很多这样的以 lastUpadted 结尾的文件,可以定义一个批处理文件,在其中编写如下脚本来删除:

set REPOSITORY_PATH=D:\Develop\Development Tool\mvn-repository
rem 正在搜索...

del /s /q %REPOSITORY_PATH%\*.lastUpdated

rem 搜索完毕
pause

上面的 REPOSITORY_PATH= 后面是本地仓库的地址。定义批处理文件 del_lastUpdated.bat (直接创建一个文本文件,命名为 del_lastUpdated,后缀名直接改为 bat 即可 ),需要清理 Maven 仓库的时候双击运行即可删除 Maven 仓库中的残留文件。

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OG one.Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值