【Maven】功能和核心概念

发布于:2024-11-29 ⋅ 阅读:(26) ⋅ 点赞:(0)

1. 什么是Maven

1.1 Maven的概念

Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建依赖管理

1.2 为什么要使用Maven?

  1. 在项目开发中,我们需要引用各种 jar 包,引用的 jar 包可能有几十个乃至上百个,每个都要到其官网去下载,而且每个 jar 包都需要手动引入到工程目录,期间会经常遇到 jar 包冲突版本冲突等。Maven 可以自动下载 jar 包及依赖包添加到项目中,大大减轻了工作负担。
  2. Java 文件需要编译成二进制字节码文件,我们可以借助各种集成开发工具完成,如 IDEA 可以将代码即时编译。但有时候我们需要多个模块同时编译,就必须要借助于 Maven 工具了。
  3. 每个项目或模块开发过程中都可能会有 bug,因此写完了代码,还要写一些单元测试,然后一个个的运行来检验代码质量,Maven 提供了专门的测试插件来实施测试
  4. 我们需要把代码与各种配置文件、资源整合到一起,定型打包。如果是 web 项目,还需要将其发布到服务器进行调用,这些都可以通过 Maven 轻松搞定。

1.3 项目的构建过程

构建(build)是面向过程的(从开始到结尾的多个步骤),涉及到多个环节的协同工作。
请添加图片描述

构建过程的几个主要环节:

  1. 清理:删除以前的编译结果,为重新编译做好准备。
  2. 编译:将 Java 源程序编译为字节码文件。
  3. 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
  4. 报告:在每一次测试后以标准的格式记录和展示测试结果。
  5. 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web 工程对应 war 包。
  6. 安装:在 Maven 环境下特指将 jar 包安装到本地仓库中。这样 jar 包项目就可以被其他的 Maven 项目通过依赖的方式引入。
  7. 部署:将 jar 包部署到私服上,其他开发人员就可以从公司私服下载并安装到本地仓库。

1.4 Maven的两大核心功能

1.4.1 项目构建

对项目进行编译、测试、打包、部署等构建。

1.4.2 依赖管理

对 jar 包的统一管理,Maven 提供中央仓库、私服、本地仓库来解决 jar 包的依赖和相关依赖的下载。在项目中使用 标签引入依赖后,Maven 会从远程仓库或本地仓库获取对应的 jar 包并添加到当前项目中。

如下图所示,包括蓝、黄两个部分分别对应着依赖管理项目构建两大核心功能:
请添加图片描述

2. Maven的核心概念

2.1 什么是POM

POM(Project Object Model)项目对象模型,它是 Maven 的核心组件,是 Maven 中的基本工作单元。它是一个 xml 文件,以 pom.xml 文件方式存在于项目的根目录中。POM 不仅包含有关项目的信息及 Maven 用于构建项目的各种配置的详细信息,还包含目标和插件。

pom.xml 文件举例:

<!--添加父工程的引用-->
<parent>
  <groupId>com.bjpowernode.xiaomi</groupId>
  <artifactId>xiaomi-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
</parent>

<!--本项目的身份证号gav-->
<groupId>com.bjpowernode</groupId>
<artifactId>springmvc_006_ssm</artifactId>          
<version>1.0.0</version>
<!--打包方式-->
<packaging>war</packaging>

<!--集中定义依赖版本号,使用属性-->
<properties>
  <!--mysql驱动的依赖-->
  <mysql.version>5.1.32</mysql.version>
</properties>

<!--添加依赖-->
<dependencies>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
  </dependency>            
</dependencies>

<build>
  
  <!--聚合工程-->
  <modules>
    <module>xiaomi-manager-pojo</module>
    <module>xiaomi-manager-mapper</module>
    <module>xiaomi-manager-service</module>
    <module>xiaomi-manager-web</module>
  </modules>
  
  <!--插件配置-->
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>17</source>
        <target>17</target>
        <encoding>UTF-8</encoding>
      </configuration>
    </plugin>
  </plugins>
  
  <!--指定配置文件识别路径-->
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
    </resource>
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
    </resource>
  </resources>
</build>

2.2 什么是约定的目录结构

Maven 项目约定好了目录结构,所有的 Maven 项目都必须依照这个规范。主要的目的是将项目的源码文件、测试代码和资源文件完全分开,便于项目管理和扩展
在这里插入图片描述

附:

1、如何理解 Maven 将源码和测试代码分开了?

如下图代码所示,就是将业务代码和测试代码杂糅在一起了:

请添加图片描述

2、文件夹的属性

在 Maven 项目中,目录结构已经定义好,并且不同的目录的属性也已经定义好了。

请添加图片描述

2.3 什么是坐标GAV

也称为 GAV 定位。使用三个标签来唯一定位 jar 资源,即 groupId、artifactId 和 version坐标是资源的唯一定位,创建项目时定义 GAV 名称,引用项目时使用 GAV 名称。相当于项目的身份证号。

  1. groupId组织名称,一般是公司域名的倒写,如 com.myphoenix
  2. artifactId项目名称,如 big-marketing-lxx
  3. version版本编号,如 1.0-SNAPSHOT(开发时的临时版本号)、5.2.5.RELEASE(发布版本)

2.4 什么是仓库

存放 jar 包的位置。Maven 中所有的 jar 包都在仓库中。仓库分为本地仓库和远程仓库。

2.4.1 本地仓库

  • 本地仓库存储在本地机器上,默认存放在~.m2\repository中,为本机上的所有 Maven 工程服务。
  • 可以通过 Maven 的配置文件 Maven_home/conf/settings.xml 修改本地仓库所在的目录。~ 是用户的主目录,Windows 系统中是c:/user/用户名
    请添加图片描述

注:结合仓库来看,GAV 实际上表现为一级级的目录。

1、在项目的 pom.xml 文件中引入 MySQL 依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
</dependency>

2、查看本地仓库配置:

请添加图片描述

3、打开本地仓库:

C:\Softwares\Developer_Kits\apache-maven-3.8.8\repository\mysql\mysql-connector-java\8.0.22

请添加图片描述

由上图可以看到,在 pom.xml 文件中,MySQL 依赖的 GAV 3 个标签对应了 3 层目录

2.4.2 远程仓库

远程仓库包括:

  • 为全世界范围内的开发人员提供服务的中央仓库
  • 为全世界范围内某些特定的用户提供服务的中央仓库镜像
  • 为本公司提供服务自己架设的私服

中央仓库是 Maven 默认的远程仓库,其地址是 http://repo.maven.apache.org/maven2/,中央仓库包含了绝大多数流行的开源 Java 构件,以及源码、作者信息、许可证信息等。一般来说,简单的 Java 项目依赖的构件都可以在这里下载得到。

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 Maven 用户使用。当 Maven 需要下载构件的时候,它先请求私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为 Maven 的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。
请添加图片描述

程序员常用的一个仓库:http://mvnrepository.com/

请添加图片描述

2.5 什么是依赖

依赖就是 jar 包。

  • 所有的资源都是以 GAV 的形式进行定义的,也是通过 GAV 来添加引用。
  • <dependencies> 大标签中,通过子标签 <dependency> 指定 GAV 进行引用。

2.6 什么是生命周期

对应项目构建的过程,如下图:
请添加图片描述

构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成。无论我们要进行哪个阶段的构建,直接执行相应的命令即可,无需担心它前面的阶段是否构建,Maven 都会自动构建,也就是说都是从这个生命周期的最初阶段开始的。

使用 Intellij IDEA 后,生命周期要调用的命令被集成化一些按钮,只需要双击即可调用相应的插件来运行:
请添加图片描述

生命周期对应的 Maven 命令:

  1. mvn clean:清理。会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除。
  2. mvn compile:编译主程序。会在当前目录下生成一个 target 目录,里边存放编译主程序之后生成的字节码文件。
  3. mvn test-compile:编译测试程序。会在当前目录下生成一个 target 目录,里边存放编译测试程序之后生成的字节码文件。
  4. mvn test:测试。会生成一个目录 surefire-reports,保存测试结果。
  5. mvn package:打包主程序。会编译、编译测试、测试,并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包。
  6. mvn install:安装主程序。会将本工程打包,并且按照本工程的坐标保存到本地仓库中。
  7. mvn deploy:部署主程序。部署到私服仓库中。

2.7 什么是插件

Maven 本质上是一个插件框架,插件就是集成化的功能。它的核心并不执行任何具体的构建任务,所有任务都交给插件来完成,例如编译源代码是由 maven-compiler-plugin 完成的。

进一步说,每个任务对应了一个插件目标,每个插件会有一个或者多个目标,例如 maven-compiler-plugin 的compile 目标用来编译位于 src/main/java/ 目录下的主源码,testCompile 目标用来编译位于 src/test/java/ 目录下的测试源码。

Maven 支持极简化的插件添加,在 <plugins> 大标签中添加 <plugin> 子标签引用插件: