maven

Maven基础

简介

Maven的本质就是一个项目管理工具,将项目开发和管理过程 抽象成一个项目对象模型(POM)。

maven模型

  • 项目对象模型 (Project Object Model)
  • 依赖管理模型(Dependency)
  • 插件(Plugin)

image-20211224213512149

构建生命周期就是提供了一些插件来供我们完成标准化构建流程,如我们需要编译,Maven提供了一个编译插件供我们使用等等。

项目对象模型就是将我们自己抽象成一个对象模型,有自己专属的坐标,如下图所示是一个Maven项目:

image-20211224213805172

依赖管理模型则是使用坐标来描述当前项目依赖哪些第三方jar包:

image-20211224213859585

作用

  • 提供了一套标准化的项目结构
  • 提供了一套标准化的构建流程(编译,测试,打包,发布……)
  • 提供了一套依赖管理机制

标准化的项目结构

而Maven提供了一套标准化的项目结构,所有的IDE使用Maven构建的项目完全一样,所以IDE创建的Maven项目可以通用。如下图右边就是Maven构建的项目结构。

image-20211224212758925

标准化构建流程

image-20211224212828979

如上图所示我们开发了一套系统,代码需要进行编译、测试、打包、发布,这些操作如果需要反复进行就显得特别麻烦,而Maven提供了一套简单的命令来完成项目构建。即你执行发布命令的时候前边的步骤都会执行一遍

依赖管理

管理你项目所依赖的第三方资源(jar包、插件)

image-20211224213011287

Maven坐标详解

什么是坐标?

  • Maven 中的坐标是资源的唯一标识

  • 使用坐标来定义项目或引入项目中需要的依赖

  • Maven 坐标主要组成

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

如下图就是使用坐标表示一个项目:

image-20210726174718176

注意:

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

仓库

仓库分类:

  • 本地仓库:自己计算机上的一个目录

  • 中央仓库:由Maven团队维护的全球唯一的仓库

    • 地址: https://repo1.maven.org/maven2/
  • 远程仓库(私服):一般由公司团队搭建的私有仓库

jar包查找的顺序为:

本地仓库 --> 远程仓库–> 中央仓库

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

image-20211224214357487

Maven安装配置

目录结构

image-20211224214529524
  • bin目录 : 存放的是可执行命令。mvn 命令重点关注。
  • conf目录 :存放Maven的配置文件。里面的settings.xml 配置文件后期需要修改。
  • lib目录 :存放Maven依赖的jar包。Maven也是使用java开发的,所以它也依赖其他的jar包。

配置本地仓库

修改 conf/settings.xml 中的 为一个指定目录作为本地仓库,用来存储jar包。

image-20211224214639746

配置阿里云私服

中央仓库在国外,所以下载jar包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的jar包。

修改 conf/settings.xml 中的 标签,为其添加如下子标签:

<mirror>  
    <id>alimaven</id>  
    <name>aliyun maven</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>          
</mirror>

Maven的基本使用

maven的常用命令(mvn + )

  • compile :编译
  • clean:清理
  • test:测试
  • package:打包
  • install:安装

注意:我们使用上面这些命令需要和项目的pom.xml在同一目录。并且要配置对应的环境变量。

maven的生命周期

Maven 构建项目生命周期描述的是一次构建过程经历经历了多少个事件

Maven 对项目构建的生命周期划分为3套:
  • clean :清理工作。
  • default :核心工作,例如编译,测试,打包,安装等。
  • site : 产生报告,发布站点等。这套声明周期一般不会使用。

同一套生命周期内,执行后边的命令,前面的所有命令会自动执行。例如默认(default)生命周期如下:

image-20211224215147878

默认的生命周期也有对应的很多命令,其他的一般都不会使用,我们只关注常用的:

image-20210726173619353

当我们执行install的时候,他会把上边的命令都会执行。这是default生命周期的全部命令。

插件

插件与生命周期内的各个阶段绑定,在执行到对应生命周期时执行对应的插件功能。

默认maven在各个生命周期上绑定有预设的功能。

通过插件可以自定义其他功能。

image-20220102133737629

IDEA对MAVEN的基本使用

IDEA中配置MAVEN

选择 IDEA中 File --> Settings ,搜索maven

image-20211224215442920

Maven项目

IDEA中创建maven项目
  • 创建模块,选择Maven,点击Next
image-20210726175049876
  • 填写模块名称,坐标信息,点击finish,创建完成
image-20210726175109822
  • 创建好的项目目录结构如下:

image-20210726175244826

IDEA中导入Maven项目
  • 选择右侧Maven面板,点击 + 号
image-20210726182702336
  • 选中对应项目的pom.xml文件,双击即可
image-20210726182648891

maven工程(web项目、web工程)

web项目结构
Maven Web项目结构: 开发中的项目
1627202865978
开发完成部署的Web项目
1627202903750
  • 开发项目通过执行Maven打包命令package,可以获取到部署的Web项目目录
  • 编译后的Java字节码文件和resources的资源文件,会被放到WEB-INF下的classes目录下
  • pom.xml中依赖坐标对应的jar包,会被放入WEB-INF下的lib目录下
创建web工程
使用web项目骨架创建
1627204022604
使用普通方式创建maven web项目
1627204076090

依赖管理

使用坐标引入jar包的步骤:

  • 在项目的 pom.xml 中编写 标签
  • 在 标签中 使用 引入坐标
  • 定义坐标的 groupId,artifactId,version
image-20210726193105765
  • 点击刷新按钮,使坐标生效
image-20210726193121384

快捷方式导入jar包的坐标:

  • (mac)在 pom.xml 中 按 alt + N,选择 Dependency
  • 在弹出的面板中搜索对应坐标,然后双击选中对应坐标

依赖传递

依赖具有传递性:

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系(即你在当前maven项目中直接配置的坐标)
  • 间接依赖:在当前项目中通过坐标配置的依赖如果含有其他资源,则当前项目间接依赖其他资源(即含有你配置的依赖所依赖的依赖)
image-20220102124832825

依赖管理

  • 路径优先:当依赖中出现有相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。
  • 声明优先:当资源在相同资源被依赖时,配置顺序靠前的覆盖配置顺序靠后的。
  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的(这个不用太考虑)。
  • image-20220102125441180

可选依赖

可选依赖指对外隐藏当前依赖所依赖的资源—不透明(即别的模块中含有了你这个模块,但是如果你要在你说依赖的资源中写上true的话,那么这个别的模块就看不到你这个依赖)

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId> 
  <version>4.12</version>
  <!--默认是false-->
  <optional>true</optional>
</dependency>

排除依赖

排除依赖指主动断开依赖的资源,被排除的资源无需指定版本—不需要(即排除该依赖所依赖的资源)

<dependency> 
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version> 
  <exclusions> 
    <exclusion> 
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-core</artifactId>
		</exclusion>
	</exclusions>
</dependency>

依赖范围

通过设置坐标的依赖范围(scope),可以设置 对应jar包的作用范围:编译环境、测试环境、运行环境。

如下图所示给 junit 依赖通过 scope 标签指定依赖的作用范围。 那么这个依赖就只能作用在测试环境,其他环境下不能使用。

image-20210726194703845
依赖范围主代码测试代码打包例子
compile(默认)YYYlogback
test-Y-Junit
providedYY-servlet-api
runtime-YYjdbc驱动
systemYY-存储在本地的jar包

这里的范围主要指以下三种范围

  1. 主程序范围有效(src/main目录范围内)
  2. 测试程序范围内有效(src/test目录范围内 )
  3. 是否参与打包(package指令范围内)

Maven高级

聚合(快速共建项目)

作用:聚合用于快速构建maven工程,一次性构建多个项目/模块。

制作方式

  1. 定义一个空模块(即没有src目录的模块),打包类型设置为pom

    <packaging>pom</packaging>
    
  2. 定义当前模块进行构建操作时关联的其他模块的名称

    <modules>
    	<module>maven模块名称</module>
    </modules>
    

    注:参与聚合的模块最终执行顺序和模块间的依赖关系有关,与配置顺序无关。

继承(快速配置)

作用:通过继承可以实现在子工程中沿用父工程中的配置。

制作方式

  1. 在子工程中生命父工程坐标与对应的位置

    <!--定义该工程的父工程-->
    <parent>
    	<groupId>com.zjw</groupId>
      <artifactId>父工程名</artifactId>
      <version>1.0-SNAPSHOP</version>
      <!--填写父工程的pom文件-->
      <relativePath>父工程的pom文件</relativePath>
    </parent>
    
  2. 在父工程中定义依赖管理
    image-20220103123640056

  3. 在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本。
    image-20220103123724295

继承的资源(不重要)

image-20220103123817669

属性(版本统一)

自定义属性(重点)

作用:等同于定义变量,方便统一维护

定义格式

image-20220103124055793

调用格式

image-20220103124124430

内置属性(重点)

作用:使用maven的内置属性,快速配置

例如:image-20220103124401199

调用格式

${version}
${basedir}

Setting属性

作用:使用Maven配置文件setting.xml文件中的标签属性,用于动态配置

调用格式

${settings.标签名}

Java系统属性

作用:读取Java系统属性

调用格式

${user.home}

系统属性查询方式

mvn help:system

环境变量属性

调用格式

${env.JAVA_HOME}

环境变量属性查询方式

mvn help:system

版本管理

工程版本

SNAPSHOT(快照版本):即调试版本,属于测试阶段的版本

RELEASE(发布版本): 即这个版本对应的构件文件是稳定的,即稳定文本,可以发布。

工程版本约定(视具体情况)

image-20220103130007332

资源配置(不重要,这种配置方式也不太好)

image-20220103130241187

配置

image-20220103130257328

跳过测试(不建议)

使用命令跳过测试

命令:mvn 指令 -D skipTests

使用界面跳过测试(idea)

image-20220103130611703

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
>