Maven从零单排

194 阅读7分钟

环境 系统:macOS Maven:3.6.0

Maven Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需要做一些简单的配置,Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作

约定优于配置

约定优于配置(Convention Over Configuration)是 Maven 最核心的涉及理念之一 ,Maven对项目的目录结构、测试用例命名方式等内容都做了规定,凡是使用 Maven 管理的项目都必须遵守这些规则。

下表显示了项目源代码文件,资源文件和其他配置在 Maven 项目中的默认位置

文件目录
Java 源代码src/main/java
资源文件src/main/resources 
测试源代码src/test/java 
测试资源文件src/test/resources
打包输出文件target
编译输出文件target/classes

Maven 对系统要求如下表:

JDKJDK 7.0 及以上。
内存没有最低要求。
磁盘空间Maven 安装本身大约需要 10MB。除此之外,其他磁盘空间将用于本地 Maven 存储库。本地存储库的大小将根据使用情况而有所不同,但至少应为 500MB。
操作系统没有最低要求

POM

POM(Project Object Model,项目对象模型)是 Maven 的基本组件,它是以 xml 文件的形式存放在项目的根目录下,名称为 pom.xml。POM 中定义了项目的基本信息,用于描述项目如何构建、声明项目依赖等等。当 Maven 执行一个任务时,它会先查找当前项目的 POM 文件,读取所需的配置信息,然后执行任务。在创建 POM 之前,首先要确定工程组(groupId),及其名称(artifactId)和版本,在仓库中这些属性是项目的唯一标识.在 POM 中可以设置如下配置:

  • 项目依赖
  • 插件
  • 目标
  • 构建时的配置文件
  • 版本 
  • 开发者
  • 邮件列表

Super POM

无论 POM 文件中是否显示的声明,所有的 POM 均继承自一个父 POM,这个父 POM 被称为 Super POM,它包含了一些可以被继承的默认设置。在maven项目下终端中使用mvn help:effective-pom查看Super POM相关配置。 实际开发过程中,Maven 的 pom.xml 文件不需要手工编写,Maven 提供了大量的原型(Archetype)插件来创建项目,包括项目结构和 pom.xml

命令行创建Maven项目 mvn archetype:generate -DgroupId=net.demo.www -DartifactId=helloMaven -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
参数说明:

  • -DgroupId: 项目组 ID,通常为组织名或公司网址的反写。
  • -DartifactId: 项目名。
  • -DarchetypeArtifactId: 指定 ArchetypeId,maven-archetype-quickstart 用于快速创建一个简单的 Maven 项目。
  • -DinteractiveMode: 是否使用交互模式

目录及文件说明:

  • helloMaven:项目名,包含 src 文件夹和 pom.xml。
  • src/main/java:用于存放项目的 Java 文件。
  • src/main/resources:用于存放项目资源文件。
  • src/test/java:用于存放所有测试 Java 文件,如 JUnit 测试类。
  • src/test/resources :用于存放测试资源文件。
  • target:项目输出位置,用于存放编译后的文件。
  • pom.xml:Maven 项目核心配置文件。

Tips: maven-archetype-quickstart 原型快速创建一个简单的 Maven 项目

构建项目 mvn clean package 编译后生成target目录说明:

  • Maven 命令中包含了两个命令:clean 和 package,其中 clean 负责清理 target 目录,package 负责将项目构建并打包输出为 jar 文件。
  • classes:源代码编译后存放在该目录中。
  • test-classes:测试源代码编译后并存放在该目录中。
  • surefire-reports:Maven 运行测试用例生成的测试报告存放在该目录中。
  • helloMaven-1.0-SNAPSHOT.jar:Maven 对项目进行打包生成的 jar 文件。

Maven坐标

<project>
  <groupId>net.biancheng.www</groupId>
  <artifactId>helloMaven</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
</project>

Maven 坐标主要由以下元素组成:

  • groupId: 项目组 ID,定义当前 Maven 项目隶属的组织或公司,通常是唯一的。它的取值一般是项目所属公司或组织的网址或 URL 的反写,例如 com.baidu.www。
  • artifactId: 项目 ID,通常是项目的名称。
  • version:版本。
  • packaging:项目的打包方式,默认值为 jar。 Tips:以上 4 个元素中 groupId、artifactId 和 version 是必须定义的,packaging 是可选的。

依赖

  • Maven 坐标是依赖的前提,所有 Maven 项目必须明确定义自己的坐标,只有这样,它们才可能成为其他项目的依赖
<dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
</dependencies>
  • scope:依赖的范围。
  • optional:标记依赖是否可选。
  • exclusions:用来排除传递性依赖 Tips:大部分依赖声明只包含 groupId、artifactId 和 version 三个元素,至于 scope、optional 以及 exclusions 等元素,需要的时候查看文档即可

Maven仓库

image.png

本地仓库

Maven 本地仓库实际上就是本地计算机上的一个目录(文件夹),它会在第一次执行 Maven 命令时被创建 配置本地仓库:$MAVEN_HOME/conf 目录下的 settings.xml 文件,通过 localRepository 元素定义另一个本地仓库地址

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
   http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>$HOME/.m2/repository</localRepository>
</settings>

中央仓库

中央仓库是由 Maven 社区提供的一种特殊的远程仓库,它包含了绝大多数流行的开源构件

远程仓库

如果 Maven 在本地仓库和中央仓库中都找不到依赖的库文件,它就会停止构建过程并输出错误信息到控制台。为避免这种情况的发生,Maven 还提供了远程仓库的概念,它是一种由开发人员自己定制的仓库,其中包含了供其他项目使用的代码库或者构件

Maven 依赖搜索顺序

当通过 Maven 构建项目时,Maven 按照如下顺序查找依赖的构件。

  1. 从本地仓库查找构件,如果没有找到,跳到第 2 步,否则继续执行其他处理。
  2. 从中央仓库查找构件,如果没有找到,并且已经设置其他远程仓库,然后移动到第 4 步;如果找到,那么将构件下载到本地仓库中使用。
  3. 如果没有设置其他远程仓库,Maven 则会停止处理并抛出错误。
  4. 在远程仓库查找构件,如果找到,则会下载到本地仓库并使用,否则 Maven 停止处理并抛出错误。

声明周期 | 阶段 | 描述 | | --------------------- | -------------------------------------------- | | validate | 验证项目是否正确以及所有必要信息是否可用。 | | initialize | 初始化构建状态。 | | generate-sources | 生成编译阶段需要的所有源码文件。 | | process-sources | 处理源码文件,例如过滤某些值。 | | generate-resources | 生成项目打包阶段需要的资源文件。 | | process-resources | 处理资源文件,并复制到输出目录,为打包阶段做准备。 | | compile | 编译源代码,并移动到输出目录。 | | process-classes | 处理编译生成的字节码文件 | | generate-test-sources | 生成编译阶段需要的测试源代码。 | | process-test-sources | 处理测试资源,并复制到测试输出目录。 | | test-compile | 编译测试源代码并移动到测试输出目录中。 | | test | 使用适当的单元测试框架(例如 JUnit)运行测试。 | | prepare-package | 在真正打包之前,执行一些必要的操作。 | | package | 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。 | | pre-integration-test | 在集成测试执行之前,执行所需的操作,例如设置环境变量。 | | integration-test | 处理和部署所需的包到集成测试能够运行的环境中。 | | post-integration-test | 在集成测试被执行后执行必要的操作,例如清理环境。 | | verify | 对集成测试的结果进行检查,以保证质量达标。 | | install | 安装打包的项目到本地仓库,以供其他项目使用。 | | deploy | 拷贝最终的包文件到远程仓库中,以共享给其他开发人员和项目。 |

分模块开发

  • 1.在项目中添加子module,子module拥有自己的pom.xml文件
    1. 把子pom.xml文件中的坐标复制到项目中<dependency></dependency>
    1. 在子module中执行 mvn install 把jar包安装到本地的仓库中

依赖管理

image.png

依赖冲突

  • 路径深度相同的最后配置的为主 image.png

可选依赖:主观上我项目中的依赖不想让别人使用 不透明 可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递性,通过标签控制

image.png

排出依赖:主观上不想再项目中使用别人的依赖 不需要 排出依赖是隐藏当前资源对应的依赖关系,使用标签控制

聚合

  • 会按照依赖关系自动构建pom.xml
<packaging>pom</packaging>
<modules>
    <module>path</module>
</modules>

继承

<parent>
    <relativePath> path </relativePath>
</parent>
  • 可选依赖

image.png

image.png

属性

image.png

<properties> 
    // 在引用的地方直接使用${spring-version}
    <spring-version>5.2.10.RELEASE</spring-version>
</properties>
  • properties文件获取pom文件的自定义属性 image.png

  • 添加打war包的插件

image.png

多环境配置

image.png

image.png

image.png

跳过测试

image.png

image.png