Maven介绍

38 阅读6分钟

Maven的概念和作用

Maven是什么?

  • Maven 是一个项目管理工具。

Maven有什么用?

  • Maven 可以对Java项目进行构建、依赖管理。

什么是构建(build)

  • 构建是以源代码 (例如Java代码、配置文件) 为原材料,生产出可以运行的项目 (例如war包) 的过程。

Maven基本概念-仓库

  • 仓库:用于存储资源,各种 jar 包。
  • 仓库分类:
    • 本地仓库:自己电脑上的仓储,从远程仓库获取资源
    • 远程仓库:
      • 中央仓库:Maven团队维护的仓库,包含所有开源资源
      • 私服:公司或其他组织维护的仓库,包含从中央仓库获取的资源和内部资源
  • 为什么要有私服?
    • 提升本地资源获取速度,本地仓库直接从私服获取资源,不需要每次都请求中央仓库
    • 保存内部资源

image.png

Maven基本概念-坐标

  • Maven坐标的作用:用于描述资源在仓库中的位置,Maven根据坐标来定位资源
  • Maven坐标的组成:
    • groupId:组id,隶属的组织名称 (通常是域名反写,例如 com.jirengu )
    • artifactId:项目名称 (例如 bank,hotel)
    • version:版本号
  • Maven仓库:mvnrepository.com/

image.png

仓库配置-Windows

  • (1) 本地仓库配置
    • 通常不需要配置,因为IDEA初次使用maven时,会在默认位置自动创建
    • 默认本地仓库位置为 C:\Users\username.m2\repository,M2_HOME\conf\settings.xml 里配置仓库位置
    • 如果要手动配置本地仓库,到 C:\Users\username\ 目录下输入 mvn 命令,创建一个空的本地仓库
  • (2) 远程仓库配置
    • 如果A仓库能提供B仓库的所有资源,那么可以认为A是B的镜像
    • 配置镜像,加快资源获取速度
    • 镜像不是私服,镜像也对外公开
    • 修改 settings.xml 文件配置镜像
<mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>https://maven.aliyun.com/repository/public</url>
      <mirrorOf>central</mirrorOf>
   </mirror>

IDEA创建 Maven 工程

  • 第一步:创建一个空项目
  • 第二步:修改 IDEA Maven 配置
  • 第三步:新建模块,选择 Maven,修改 groupId、artifactId

IDEA创建 Maven 工程 – 使用原型

  • 非 web 项目,使用 quickstart 原型
  • web 项目,使用 webapp 原型

Maven项目结构

  • (1)非web项目

image.png

  • (2)web项目

image.png

单元测试简单介绍

  • 什么是单元测试(unit testing)?

对软件中的最小可测试单元进行检查和验证。最小可测试单元的大小或者范围很难界定,一般就是指对我们所写的方法进行功能测试。

  • 为什么要进行单元测试?

单元测试是程序员对代码进行的自我检查。任何代码都有可能存在 bug(逻辑错误),单元测试可以帮助我们在开发时发现这些bug,尽可能避免在实际生产环境中出现bug。

pom.xml 配置文件的结构

  • POM (Project Object Model),项目对象模型。
  • Maven将项目开发和管理过程抽象成一个项目对象模型 (POM)。
  • pom.xml 配置文件描述了项目的信息,Maven 通过加载 pom.xml 掌握项目信息。
  • 一个基础的 pom.xml 文件结构可以分为3大块
    • 基本信息
    • 坐标配置
    • 依赖配置

image.png

Maven项目构建与生命周期

什么是生命周期?

  • 生命周期用来表示一个生物从出生到死亡的过程。
  • 在软件开发领域,生命周期用来表示一个对象从创建到销毁的过程。
  • Maven 用生命周期定义了项目构建和发布的过程,定义了生命周期包含哪些阶段。

Maven生命周期

  • clean:项目清理
    • pre-clean:执行一些需要在clean之前完成的工作
    • clean:移除所有上一次构建生成的文件
    • post-clean:执行一些需要在clean之后立刻完成的工作
  • default (或 build) : 项目部署 (重点!!!)
  • site : 项目站点文档创建的处理 (使用较少)

default 生命周期

image.png

Maven在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行

如何运行 Maven 生命周期

  • 方法一:IDEA 侧边栏 image.png
  • 方法二:命令行执行 mvn 命令。例如:mvn clean package
  • 方法三:配置 Configuration

image.png

Maven依赖管理

依赖配置

  • 在标签下配置依赖
  • 一个依赖配置一个
  • 每个依赖配置都需要指定坐标

image.png

依赖传递

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

image.png

对于 maven05,maven04 和 maven02 是直接依赖,maven03、maven 01、maven06 是间接依赖

依赖冲突

  • 依赖冲突的概念:jar包之间的间接依赖,导致项目依赖同一种jar包的多个版本
  • 当发生依赖冲突是会Maven会选择哪个版本 ?
    • 路径优先:层级越浅,优先级越高
    • 声明优先:层级相同时,配置顺序靠前的覆盖靠后的
    • 同一个配置文件中:靠后的覆盖靠前的

image.png

image.png

发现依赖冲突

  • 方法一:命令行输入命令 mvn -Dverbose dependency:tree

image.png

  • 方法二:使用 IDEA 插件 Maven Helper (推荐)

image.png

解决依赖冲突

  • 方法一:直接依赖正确版本的jar包。根据路径优先原则,直接依赖的层级最浅,使用的jar包版本一定是直接依赖的版本。

image.png

  • 方法二:依赖排除。使用 exclusion 排除掉不希望存在的传递性依赖。

image.png

image.png

快照版本(SNAPSHOT) vs 正式版本(release)

  • 快照版本号以 SNAPSHOT 结尾(例如 1.0-SNAPSHOT),是开发调试阶段使用的版本
  • 开发阶段可能会进行快节奏的bug修复或改进,会需要频繁将资源发布到远程仓库
  • 同一个快照版本可以多次发布到远程仓库,新的覆盖旧的。非快照版本版本号不能冲突。
  • 资源依赖方如果使用的是快照版本,那么每次构建都会从自动获取最新快照
  • 快照版本可以解决两个问题:
    • 避免版本号爆炸
    • 提升团队间开发合作效率

image.png

IDEA Maven 配置对新项目生效

  • 在 IntelliJ IDEA -> Settings -> Build, Execution, Deployment -> Maven 中修改了 Maven 配置
  • 但这么修改只对当前项目生效,新创建的项目仍然是默认的 Maven 配置

image.png

  • 在修改对新项目生效,需要修改 File -> New Projects Setup -> Settings for New Projects 中的 Maven 配置
  • 重启 IDEA (File -> Invalid Caches and restart),创建新工程

image.png

image.png

在 pom 文件中配置Java语言版本

  • 默认是1.6,改成默认1.8
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>