Maven - 快速指南


Maven - 概述

什么是马文?

Maven 是一个项目管理和理解工具,为开发人员提供了完整的构建生命周期框架。由于 Maven 使用标准目录布局和默认构建生命周期,开发团队几乎可以立即自动化项目的构建基础设施。

在多个开发团队环境的情况下,Maven可以在很短的时间内建立起按标准工作的方式。由于大多数项目设置都很简单且可重用,Maven 在创建报告、检查、构建和测试自动化设置时使开发人员的生活变得轻松。

Maven 为开发人员提供了管理以下内容的方法 -

  • 构建
  • 文档
  • 报告
  • 依赖关系
  • 单片机
  • 发布
  • 分配
  • 邮件列表

总而言之,Maven 简化并标准化了项目构建过程。它无缝地处理编译、分发、文档、团队协作和其他任务。Maven 提高了可重用性并负责大部分与构建相关的任务。

Maven的演变

Maven 最初是为了简化 Jakarta Turbine 项目的构建过程而设计的。有多个项目,每个项目包含略有不同的 ANT 构建文件。JAR 已签入 CVS。

Apache 小组随后开发了Maven,它可以一起构建多个项目、发布项目信息、部署项目、跨多个项目共享 JAR 并帮助团队协作。

客观的

Maven 的主要目标是为开发人员提供以下功能 -

  • 一个全面的项目模型,可重用、可维护且更易于理解。

  • 与此声明性模型交互的插件或工具。

Maven项目的结构和内容在一个xml文件pom.xml中声明,称为项目对象模型(POM),它是整个Maven系统的基本单元。在后面的章节中,我们将详细讲解POM。

约定优于配置

Maven 使用约定优于配置,这意味着开发人员不需要自己创建构建过程。

开发人员不必提及每一个配置细节。Maven 为项目提供了合理的默认Behave。创建 Maven 项目时,Maven 会创建默认的项目结构。开发者只需要相应地放置文件,不需要在pom.xml中定义任何配置。

作为示例,下表显示了项目源代码文件、资源文件和其他配置的默认值。假设${basedir}表示项目位置 -

物品 默认
源代码 ${basedir}/src/main/java
资源 ${basedir}/src/main/resources
测试 ${basedir}/src/测试
编译后的字节码 ${basedir}/目标
可分发的 JAR ${basedir}/目标/类

为了构建项目,Maven 为开发人员提供了提及生命周期目标和项目依赖项(依赖于 Maven 插件功能及其默认约定)的选项。许多项目管理和构建相关的任务都是由 Maven 插件维护的。

开发人员可以构建任何给定的 Maven 项目,而无需了解各个插件的工作原理。我们将在后面的章节中详细讨论 Maven 插件。

Maven 的特点

  • 遵循最佳实践的简单项目设置。

  • 所有项目的使用一致。

  • 依赖管理,包括自动更新。

  • 一个庞大且不断增长的图书馆资源库。

  • 可扩展,能够轻松地用 Java 或脚本语言编写插件。

  • 无需额外配置即可即时访问新功能。

  • 基于模型的构建- Maven 能够将任意数量的项目构建为预定义的输出类型,例如 jar、war、元数据。

  • 项目信息的一致站点- 使用与构建过程相同的元数据,maven 能够生成一个网站和一个包含完整文档的 PDF。

  • 发布管理和分发发布- 无需额外配置,maven 将与您的源代码控制系统(例如 CVS)集成并管理项目的发布。

  • 向后兼容性- 您可以轻松地将项目的多个模块从旧版本的 Maven 移植到 Maven 3。它也可以支持旧版本。

  • 自动父版本控制- 无需在子模块中指定父版本进行维护。

  • 并行构建- 它分析项目依赖关系图并使您能够并行构建计划模块。使用此功能,您可以实现 20-50% 的性能提升。

  • 更好的错误和完整性报告- Maven 改进了错误报告,它为您提供了 Maven wiki 页面的链接,您可以在其中获得错误的完整描述。

Maven - 环境设置

第 1 步:验证计算机中的 Java 安装

首先,打开控制台并根据您正在使用的操作系统执行java命令。

操作系统 任务 命令
Windows 打开命令控制台 c:\> java -版本
Linux 打开命令终端 $ java -版本
苹果 打开终端 机器:< joseph$ java -版本

让我们验证所有操作系统的输出 -

操作系统 输出
Windows

java 11.0.11 2021-04-20 LTS

Java(TM) SE 运行时环境 18.9(内部版本 11.0.11+9-LTS-194)

Java HotSpot(TM) 64 位服务器 VM 18.9(内部版本 11.0.11+9-LTS-194,混合模式)

Linux

java 11.0.11 2021-04-20 LTS

Java(TM) SE 运行时环境 18.9(内部版本 11.0.11+9-LTS-194)

Java HotSpot(TM) 64 位服务器 VM 18.9(内部版本 11.0.11+9-LTS-194,混合模式)

苹果

java 11.0.11 2021-04-20 LTS

Java(TM) SE 运行时环境 18.9(内部版本 11.0.11+9-LTS-194)

Java HotSpot(TM) 64 位服务器 VM 18.9(内部版本 11.0.11+9-LTS-194,混合模式)

如果您的系统上没有安装 Java,请从以下链接http://www.oracle.com下载 Java 软件开发工具包 (SDK) 。我们假设 Java 11.0.11 作为本教程的安装版本。

第二步:设置JAVA环境

设置JAVA_HOME环境变量以指向计算机上安装 Java 的基本目录位置。例如。

操作系统 输出
Windows 设置环境变量JAVA_HOME为C:\Program Files\Java\jdk11.0.11
Linux 导出 JAVA_HOME = /usr/local/java-current
苹果 导出 JAVA_HOME = /Library/Java/Home

将 Java 编译器位置附加到系统路径。

操作系统 输出
Windows 将字符串C:\Program Files\Java\jdk11.0.11\bin添加到系统变量Path的末尾。
Linux 导出路径= $路径:$ JAVA_HOME/bin/
苹果 不需要

如上所述,使用命令java -version验证 Java 安装。

第 3 步 - 下载 Maven 存档

从https://maven.apache.org/download.cgi下载 Maven 3.8.4 。

操作系统 档案名称
Windows apache-maven-3.8.4-bin.zip
Linux Apache-maven-3.8.4-bin.tar.gz
苹果 Apache-maven-3.8.4-bin.tar.gz

第 4 步 - 提取 Maven 存档

将存档解压到您想要安装 Maven 3.8.4 的目录。将从存档中创建子目录 apache-maven-3.8.4。

操作系统 位置(根据您的安装情况可能会有所不同)
Windows C:\Program Files\Apache Software Foundation\apache-maven-3.8.4
Linux /usr/local/apache-maven
苹果 /usr/local/apache-maven

第 5 步 - 设置 Maven 环境变量

将 M2_HOME、M2、MAVEN_OPTS 添加到环境变量中。

操作系统 输出
Windows

使用系统属性设置环境变量。

M2_HOME=C:\Program Files\Apache Software Foundation\apache-maven-3.8.4 M2=%M2_HOME%\bin MAVEN_OPTS=-Xms256m -Xmx512m

Linux

打开命令终端并设置环境变量。

导出 M2_HOME=/usr/local/apache-maven/apache-maven-3.8.4 导出 M2=$M2_HOME/bin

导出 MAVEN_OPTS=-Xms256m -Xmx512m

苹果

打开命令终端并设置环境变量。

导出 M2_HOME=/usr/local/apache-maven/apache-maven-3.8.4

导出M2=$M2_HOME/bin

导出 MAVEN_OPTS=-Xms256m -Xmx512m

步骤 6 - 将 Maven bin 目录位置添加到系统路径

现在将 M2 变量附加到系统路径。

操作系统 输出
Windows 将字符串 ;%M2% 附加到系统变量 Path 的末尾。
Linux 导出路径= $ M2: $路径
苹果 导出路径= $ M2: $路径

第 7 步 - 验证 Maven 安装

现在打开控制台并执行以下mvn命令。

操作系统 任务 命令
Windows 打开命令控制台 c:\> mvn --版本
Linux 打开命令终端 $ mvn --版本
苹果 打开终端 机器:~约瑟夫$ mvn --version

最后,验证上述命令的输出,应如下所示 -

操作系统 输出
Windows

Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537)

Maven 主目录:C:\Program Files\Apache Software Foundation\apache-maven-3.8.4

Java版本:11.0.11,供应商:Oracle Corporation,运行时:C:\Program Files\Java\jdk11.0.11\

默认区域设置:en_IN,平台编码:Cp1252

操作系统名称:“windows 10”,版本:“10.0”,架构:“amd64”,系列:“windows”

Linux

Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537)

Java版本:11.0.11

Java 主目录:/usr/local/java-current/jre

苹果

Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537)

Java版本:11.0.11

Java 主目录:/Library/Java/Home/jre

Maven-POM

POM 代表项目对象模型。它是 Maven 中的基本工作单元。它是一个 XML 文件,作为 pom.xml 驻留在项目的基目录中。

POM 包含有关项目的信息以及 Maven 用于构建项目的各种配置详细信息。

POM 还包含目标和插件。在执行任务或目标时,Maven 在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。可以在 POM 中指定的一些配置如下:

  • 项目依赖关系
  • 插件
  • 目标
  • 建立档案
  • 项目版本
  • 开发商
  • 邮件列表

在创建 POM 之前,我们应该首先确定项目(groupId)、项目名称(artifactId)和版本,因为这些属性有助于唯一标识存储库中的项目。

POM 示例

<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">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.companyname.project-group</groupId>
   <artifactId>project</artifactId>
   <version>1.0</version>
</project>

需要注意的是,每个项目都应该有一个 POM 文件。

  • 所有 POM 文件都需要项目元素和三个必填字段:groupId、artifactId、version

  • 存储库中的项目符号为groupId:artifactId:version

  • POM 的最低要求 -

先生。 节点及描述
1

项目根目录

这是项目根标签。您需要指定基本架构设置,例如 apache 架构和 w3.org 规范。

2

型号版本

模型版本应为 4.0.0。

3

组ID

这是项目组的 ID。这在组织或项目中通常是独一无二的。例如,银行集团 com.company.bank 拥有所有与银行相关的项目。

4

工件ID

这是项目的 ID。这通常是项目的名称。例如,消费者银行业务。artifactId 与 groupId 一起定义了工件在存储库中的位置。

5

版本

这是该项目的版本。它与 groupId 一起在工件的存储库中使用,以将版本彼此分开。例如 -

com.company.bank:消费者银行业务:1.0

com.company.bank:消费者银行业务:1.1。

超级聚甲醛

Super POM 是 Maven 的默认 POM。所有 POM 均继承自父项或默认项(无论是否明确定义)。该基础 POM 称为Super POM,包含默认继承的值。

Maven使用有效的POM(来自超级pom的配置加上项目配置)来执行相关目标。它帮助开发人员在他/她的 pom.xml 中指定最小配置细节。尽管配置可以很容易地被覆盖。

查看超级 POM 默认配置的一个简单方法是运行以下命令:mvn help: effective-pom

在计算机上的任意目录中创建 pom.xml。使用上述示例 pom 的内容。

在下面的示例中,我们在 C:\MVN\project 文件夹中创建了一个 pom.xml。

现在打开命令控制台,进入包含 pom.xml 的文件夹并执行以下mvn命令。

C:\MVN\project>mvn help:effective-pom

Maven 将开始处理并显示 effective-pom。

C:\MVN>mvn help:effective-pom
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------< com.companyname.project-group:project >----------------
[INFO] Building project 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-help-plugin:3.2.0:effective-pom (default-cli) @ project ---
[INFO]
Effective POMs, after inheritance, interpolation, and profiles are applied:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.261 s
[INFO] Finished at: 2021-12-10T19:54:53+05:30
[INFO] ------------------------------------------------------------------------

C:\MVN>

应用继承、插值和配置文件后,有效的 POM 在控制台中显示为结果。

<?xml version="1.0" encoding="Cp1252"?>
<!-- ====================================================================== -->
<!--                                                                        -->
<!-- Generated by Maven Help Plugin on 2021-12-10T19:54:52+05:30            -->
<!-- See: http://maven.apache.org/plugins/maven-help-plugin/                -->
<!--                                                                        -->
<!-- ====================================================================== -->
<!-- ====================================================================== -->
<!--                                                                        -->
<!-- Effective POM for project                                              -->
<!-- 'com.companyname.project-group:project:jar:1.0'                        -->
<!--                                                                        -->
<!-- ====================================================================== -->
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.project-group</groupId>
   <artifactId>project</artifactId>
   <version>1.0</version>
   <repositories>
      <repository>
         <snapshots>
            <enabled>false</enabled>
         </snapshots>
         <id>central</id>
         <name>Central Repository</name>
         <url>https://repo.maven.apache.org/maven2</url>
      </repository>
   </repositories>
   <pluginRepositories>
      <pluginRepository>
         <releases>
            <updatePolicy>never</updatePolicy>
         </releases>
         <snapshots>
            <enabled>false</enabled>
         </snapshots>
         <id>central</id>
         <name>Central Repository</name>
         <url>https://repo.maven.apache.org/maven2</url>
      </pluginRepository>
   </pluginRepositories>
   <build>
      <sourceDirectory>C:\MVN\src\main\java</sourceDirectory>
      <scriptSourceDirectory>C:\MVN\src\main\scripts</scriptSourceDirectory>
      <testSourceDirectory>C:\MVN\src\test\java</testSourceDirectory>
      <outputDirectory>C:\MVN\target\classes</outputDirectory>
      <testOutputDirectory>C:\MVN\target\test-classes</testOutputDirectory>
      <resources>
         <resource>
            <directory>C:\MVN\src\main\resources</directory>
         </resource>
      </resources>
      <testResources>
         <testResource>
            <directory>C:\MVN\src\test\resources</directory>
         </testResource>
      </testResources>
      <directory>C:\MVN\target</directory>
      <finalName>project-1.0</finalName>
      <pluginManagement>
         <plugins>
            <plugin>
               <artifactId>maven-antrun-plugin</artifactId>
               <version>1.3</version>
            </plugin>
            <plugin>
               <artifactId>maven-assembly-plugin</artifactId>
               <version>2.2-beta-5</version>
            </plugin>
            <plugin>
               <artifactId>maven-dependency-plugin</artifactId>
               <version>2.8</version>
            </plugin>
            <plugin>
               <artifactId>maven-release-plugin</artifactId>
               <version>2.5.3</version>
            </plugin>
         </plugins>
      </pluginManagement>
      <plugins>
         <plugin>
            <artifactId>maven-clean-plugin</artifactId>
            <version>2.5</version>
            <executions>
               <execution>
               <id>default-clean</id>
               <phase>clean</phase>
               <goals>
                  <goal>clean</goal>
               </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
            <executions>
               <execution>
                  <id>default-testResources</id>
                  <phase>process-test-resources</phase>
                  <goals>
                     <goal>testResources</goal>
                  </goals>
               </execution>
               <execution>
                  <id>default-resources</id>
                  <phase>process-resources</phase>
                  <goals>
                     <goal>resources</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <executions>
               <execution>
                  <id>default-jar</id>
                  <phase>package</phase>
                  <goals>
                     <goal>jar</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <executions>
               <execution>
                  <id>default-compile</id>
                  <phase>compile</phase>
                  <goals>
                     <goal>compile</goal>
                  </goals>
               </execution>
               <execution>
                  <id>default-testCompile</id>
                  <phase>test-compile</phase>
                  <goals>
                     <goal>testCompile</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <executions>
               <execution>
                  <id>default-test</id>
                  <phase>test</phase>
                  <goals>
                     <goal>test</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.4</version>
            <executions>
               <execution>
                  <id>default-install</id>
                  <phase>install</phase>
                  <goals>
                     <goal>install</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <artifactId>maven-deploy-plugin</artifactId>
            <version>2.7</version>
            <executions>
               <execution>
                  <id>default-deploy</id>
                  <phase>deploy</phase>
                  <goals>
                     <goal>deploy</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <artifactId>maven-site-plugin</artifactId>
            <version>3.3</version>
            <executions>
               <execution>
                  <id>default-site</id>
                  <phase>site</phase>
                  <goals>
                     <goal>site</goal>
                  </goals>
                  <configuration>
                     <outputDirectory>C:\MVN\target\site</outputDirectory>
                     <reportPlugins>
                        <reportPlugin>
                           <groupId>org.apache.maven.plugins</groupId>
                           <artifactId>maven-project-info-reports-plugin</artifactId>
                        </reportPlugin>
                     </reportPlugins>
                  </configuration>
               </execution>
               <execution>
                  <id>default-deploy</id>
                  <phase>site-deploy</phase>
                  <goals>
                     <goal>deploy</goal>
                  </goals>
                  <configuration>
                     <outputDirectory>C:\MVN\target\site</outputDirectory>
                     <reportPlugins>
                        <reportPlugin>
                           <groupId>org.apache.maven.plugins</groupId>
                           <artifactId>maven-project-info-reports-plugin</artifactId>
                        </reportPlugin>
                     </reportPlugins>
                  </configuration>
               </execution>
            </executions>
            <configuration>
               <outputDirectory>C:\MVN\target\site</outputDirectory>
               <reportPlugins>
                  <reportPlugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-project-info-reports-plugin</artifactId>
                  </reportPlugin>
               </reportPlugins>
            </configuration>
         </plugin>
      </plugins>
   </build>
   <reporting>
      <outputDirectory>C:\MVN\target\site</outputDirectory>
   </reporting>
</project>

在上面的 pom.xml 中,您可以看到默认的项目源文件夹结构、输出目录、所需的插件、存储库、报告目录,Maven 在执行所需目标时将使用这些目录。

Maven pom.xml 也不需要手动编写。Maven 提供了许多原型插件来创建项目,这些插件按顺序创建项目结构和 pom.xml

Maven - 构建生命周期

什么是构建生命周期?

构建生命周期是一个明确定义的阶段序列,它定义了目标的执行顺序。这里的阶段代表生命周期的一个阶段。例如,典型的Maven 构建生命周期由以下阶段序列组成。

阶段 手柄 描述
准备资源 资源复制 此阶段可以自定义资源复制。
证实 验证信息 验证项目是否正确以及所有必要的信息是否可用。
编译 汇编 源代码编译是在这个阶段完成的。
测试 测试 测试适合测试框架的编译源代码。
包裹 包装 此阶段创建 JAR/WAR 包,如 POM.xml 中的打包所述。
安装 安装 此阶段将包安装在本地/远程 Maven 存储库中。
部署 部署 将最终包复制到远程存储库。

总是有注册目标的前阶段阶段,它们必须在特定阶段之前或之后运行。

当 Maven 开始构建项目时,它会逐步执行定义的阶段序列并执行在每个阶段中注册的目标。

Maven 具有以下三个标准生命周期 -

  • 干净的
  • 默认(或构建)
  • 地点

目标代表有助于项目构建和管理的具体任务它可能绑定到零个或多个构建阶段。未绑定到任何构建阶段的目标可以通过直接调用在构建生命周期之外执行。

执行顺序取决于目标和构建阶段的调用顺序。例如,考虑下面的命令。clean和package参数是构建阶段,而dependency :copy-dependencies是目标。

mvn clean dependency:copy-dependencies package

这里首先执行clean阶段,然后执行dependency:copy-dependencies goal,最后执行package阶段。

清洁生命周期

当我们执行mvn post-clean命令时,Maven 会调用由以下阶段组成的 clean 生命周期。

  • 预清洁
  • 干净的
  • 后清洁

Maven clean 目标 (clean:clean) 绑定到clean 生命周期中的clean阶段。它的clean:cleangoal通过删除构建目录来删除构建的输出。因此,当mvn clean命令执行时,Maven 会删除构建目录。

我们可以通过提及清洁生命周期的上述任何阶段中的目标来自定义此Behave。

在下面的示例中,我们将把 maven-antrun-plugin:run 目标附加到 pre-clean、clean 和 post-clean 阶段。这将使我们能够回显显示清洁生命周期各个阶段的文本消息。

我们在 C:\MVN\project 文件夹中创建了一个 pom.xml。

<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">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.projectgroup</groupId>
   <artifactId>project</artifactId>
   <version>1.0</version>
   <build>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.1</version>
            <executions>
               <execution>
                  <id>id.pre-clean</id>
                  <phase>pre-clean</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>pre-clean phase</echo>
                     </tasks>
                  </configuration>
               </execution>
            
               <execution>
                  <id>id.clean</id>
                  <phase>clean</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>clean phase</echo>
                     </tasks>
                  </configuration>
               </execution>
            
               <execution>
                  <id>id.post-clean</id>
                  <phase>post-clean</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>post-clean phase</echo>
                     </tasks>
                  </configuration>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </build>
</project>

现在打开命令控制台,转到包含 pom.xml 的文件夹并执行以下mvn命令。

C:\MVN\project>mvn post-clean

Maven 将开始处理并显示 clean 生命周期的所有阶段。

C:\MVN>mvn post-clean
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.companyname.projectgroup:project >----------------
[INFO] Building project 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.pre-clean) @ project ---
[INFO] Executing tasks
     [echo] pre-clean phase
[INFO] Executed tasks
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ project ---
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.clean) @ project ---
[INFO] Executing tasks
     [echo] clean phase
[INFO] Executed tasks
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.post-clean) @ project ---
[INFO] Executing tasks
     [echo] post-clean phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.740 s
[INFO] Finished at: 2021-12-10T20:03:53+05:30
[INFO] ------------------------------------------------------------------------

C:\MVN>

您可以尝试调整mvn clean命令,它将显示pre-clean和 clean。后清理阶段不会执行任何操作。

默认(或构建)生命周期

这是 Maven 的主要生命周期,用于构建应用程序。它有以下21个阶段。

先生。 生命周期阶段和描述
1

证实

验证项目是否正确以及完成构建过程所需的所有必要信息是否可用。

2

初始化

初始化构建状态,例如设置属性。

3

生成源

生成要包含在编译阶段的任何源代码。

4

过程源

处理源代码,例如过滤任意值。

5

生成资源

生成要包含在包中的资源。

6

流程资源

将资源复制并处理到目标目录中,为打包阶段做好准备。

7

编译

编译项目的源代码。

8

过程类

对编译生成的文件进行后处理,例如对 Java 类进行字节码增强/优化。

9

生成测试源

生成要包含在编译阶段的任何测试源代码。

10

过程测试源

处理测试源代码,例如过滤任何值。

11

测试编译

将测试源代码编译到测试目标目录中。

12

过程测试类

处理测试代码文件编译生成的文件。

13

测试

使用合适的单元测试框架(Junit 就是其中之一)运行测试。

14

准备包

在实际包装之前执行准备包装所需的任何操作。

15

包裹

获取已编译的代码并将其打包为其可分发的格式,例如 JAR、WAR 或 EAR 文件。

16

预集成测试

在执行集成测试之前执行所需的操作。例如,设置所需的环境。

17 号

集成测试

如有必要,处理包并将其部署到可以运行集成测试的环境中。

18

集成后测试

执行集成测试后执行所需的操作。例如,净化环境。

19

核实

进行任何检查以验证包裹是否有效并符合质量标准。

20

安装

将包安装到本地存储库中,可以作为本地其他项目的依赖项。

21

部署

将最终包复制到远程存储库,以便与其他开发人员和项目共享。

有几个与 Maven 生命周期相关的重要概念值得一提 -

  • 当通过 Maven 命令(例如mvncompile )调用某个阶段时,只有该阶段之前(包括该阶段)的阶段才会执行。

  • 根据打包类型(JAR / WAR / EAR),不同的 Maven 目标将绑定到 Maven 生命周期的不同阶段。

在下面的示例中,我们将把 maven-antrun-plugin:run 目标附加到 Build 生命周期的几个阶段。这将使我们能够回显显示生命周期各个阶段的文本消息。

我们更新了 C:\MVN\project 文件夹中的 pom.xml。

<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">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.projectgroup</groupId>
   <artifactId>project</artifactId>
   <version>1.0</version>
   <build>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.1</version>
            <executions>
               <execution>
                  <id>id.validate</id>
                  <phase>validate</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>validate phase</echo>
                     </tasks>
                  </configuration>
               </execution>
            
               <execution>
                  <id>id.compile</id>
                  <phase>compile</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>compile phase</echo>
                     </tasks>
                  </configuration>
               </execution>
            
               <execution>
                  <id>id.test</id>
                  <phase>test</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>test phase</echo>
                     </tasks>
                  </configuration>
               </execution>
            
               <execution>
                  <id>id.package</id>
                  <phase>package</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>package phase</echo>
                     </tasks>
                  </configuration>
               </execution>
            
               <execution>
                  <id>id.deploy</id>
                  <phase>deploy</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>deploy phase</echo>
                     </tasks>
                  </configuration>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </build>
</project>

现在打开命令控制台,进入包含 pom.xml 的文件夹并执行以下mvn命令。

C:\MVN\project>mvn compile

Maven 将开始处理并显示构建生命周期的各个阶段,直到编译阶段。

C:\MVN>mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.companyname.projectgroup:project >----------------
[INFO] Building project 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.validate) @ project ---
[INFO] Executing tasks
     [echo] validate phase
[INFO] Executed tasks
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ project ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ project ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.compile) @ project ---
[INFO] Executing tasks
     [echo] compile phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.033 s
[INFO] Finished at: 2021-12-10T20:05:46+05:30
[INFO] ------------------------------------------------------------------------

C:\MVN>

网站生命周期

Maven 站点插件通常用于创建新文档以创建报告、部署站点等。它有以下阶段 -

  • 预现场
  • 地点
  • 后站
  • 站点部署

在下面的示例中,我们将把maven-antrun-plugin:run目标附加到站点生命周期的所有阶段。这将使我们能够回显显示生命周期各个阶段的文本消息。

我们更新了 C:\MVN\project 文件夹中的 pom.xml。

<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">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.projectgroup</groupId>
   <artifactId>project</artifactId>
   <version>1.0</version>
   <build>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-site-plugin</artifactId>
            <version>3.7</version>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-project-info-reports-plugin</artifactId>
            <version>2.9</version>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.1</version>
            <executions>
               <execution>
                  <id>id.pre-site</id>
                  <phase>pre-site</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>pre-site phase</echo>
                     </tasks>
                  </configuration>
               </execution>
               
               <execution>
                  <id>id.site</id>
                  <phase>site</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>site phase</echo>
                     </tasks>
                  </configuration>
               </execution>
               
               <execution>
                  <id>id.post-site</id>
                  <phase>post-site</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>post-site phase</echo>
                     </tasks>
                  </configuration>
               </execution>
               
               <execution>
                  <id>id.site-deploy</id>
                  <phase>site-deploy</phase>
                  <goals>
                     <goal>run</goal>
                  </goals>
                  <configuration>
                     <tasks>
                        <echo>site-deploy phase</echo>
                     </tasks>
                  </configuration>
               </execution>
               
            </executions>
         </plugin>
      </plugins>
   </build>
</project>

现在打开命令控制台,进入包含 pom.xml 的文件夹并执行以下mvn命令。

C:\MVN\project>mvn site

Maven 将开始处理并显示站点生命周期的各个阶段,直至站点阶段。

C:\MVN>mvn site
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.companyname.projectgroup:project >----------------
[INFO] Building project 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-antrun-plugin:3.0.0:run (id.pre-site) @ project ---
[INFO] Executing tasks
[WARNING]      [echo] pre-site phase
[INFO] Executed tasks
[INFO]
[INFO] --- maven-site-plugin:3.7:site (default-site) @ project ---
[WARNING] Input file encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[WARNING] No project URL defined - decoration links will not be relativized!
[INFO] Rendering site with org.apache.maven.skins:maven-default-skin:jar:1.2 skin.
[INFO]
[INFO] --- maven-antrun-plugin:3.0.0:run (id.site) @ project ---
[INFO] Executing tasks
[WARNING]      [echo] site phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.323 s
[INFO] Finished at: 2021-12-10T20:22:31+05:30
[INFO] ------------------------------------------------------------------------

C:\MVN>

Maven - 构建配置文件

什么是构建配置文件?

构建配置文件是一组配置值,可用于设置或覆盖 Maven 构建的默认值。使用构建配置文件,您可以为不同的环境(例如生产环境和开发环境)自定义构建。

配置文件是使用其 activeProfiles/profiles 元素在 pom.xml 文件中指定的,并以多种方式触发。Profiles在构建时修改POM,用于给出不同目标环境的参数(例如开发、测试和生产环境中数据库服务器的路径)。

构建配置文件的类型

构建配置文件主要分为三种类型。

类型 定义在哪里
每个项目 定义在项目POM文件pom.xml中
每个用户 在 Maven 设置 xml 文件 (%USER_HOME%/.m2/settings.xml) 中定义
全球的 在 Maven 全局设置 xml 文件 (%M2_HOME%/conf/settings.xml) 中定义

配置文件激活

Maven 构建配置文件可以通过多种方式激活。

  • 明确使用命令控制台输入。
  • 通过maven设置。
  • 基于环境变量(用户/系统变量)。
  • 操作系统设置(例如,Windows 系列)。
  • 存在/丢失文件。

配置文件激活示例

让我们假设您的项目的目录结构如下 -

Maven 构建配置文件

现在,在src/main/resources下,有三个环境特定文件 -

先生。 文件名和描述
1

环境属性

如果未提及配置文件,则使用默认配置。

2

环境测试属性

使用测试配置文件时的测试配置。

3

环境产品属性

使用 prod 配置文件时的生产配置。

显式配置文件激活

在下面的示例中,我们将附加 maven-antrun-plugin:run 目标来测试阶段。这将使我们能够回显不同配置文件的短信。我们将使用 pom.xml 定义不同的配置文件,并使用 maven 命令在命令控制台激活配置文件。

假设,我们在 C:\MVN\project 文件夹中创建了以下 pom.xml。

<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">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.projectgroup</groupId>
   <artifactId>project</artifactId>
   <version>1.0</version>
   <profiles>
      <profile>
         <id>test</id>
         <build>
            <plugins>
               <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-antrun-plugin</artifactId>
                  <version>1.1</version>
                  <executions>
                     <execution>
                        <phase>test</phase>
                        <goals>
                           <goal>run</goal>
                        </goals>
                        <configuration>
                           <tasks>
                              <echo>Using env.test.properties</echo>
                              <copy file="src/main/resources/env.test.properties"
                                 tofile="${project.build.outputDirectory}/env.properties"/>
                           </tasks>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>
</project>

现在打开命令控制台,转到包含 pom.xml 的文件夹并执行以下mvn命令。使用 -P 选项将配置文件名称作为参数传递。

C:\MVN\project>mvn test -Ptest

Maven 将开始处理并显示测试构建配置文件的结果。

C:\MVN>mvn test -Ptest
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.companyname.projectgroup:project >----------------
[INFO] Building project 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ project ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ project ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ project ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ project ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ project ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (default) @ project ---
[INFO] Executing tasks
     [echo] Using env.test.properties
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.011 s
[INFO] Finished at: 2021-12-10T20:29:39+05:30
[INFO] ------------------------------------------------------------------------

C:\MVN>

现在作为练习,您可以执行以下步骤 -

  • 将另一个配置文件元素添加到 pom.xml 的配置文件元素(复制现有配置文件元素并将其粘贴到配置文件元素结束的位置)。

  • 将此配置文件元素的 ID 从测试更新为正常。

  • 更新任务部分以回显 env.properties 并将 env.properties 复制到目标目录。

  • 再次重复上述三个步骤,将 id 更新为 prod 并更新 env.prod.properties 的任务部分。

  • 就这样。现在您已经准备好三个构建配置文件(正常/测试/生产)。

现在打开命令控制台,转到包含 pom.xml 的文件夹并执行以下mvn命令。使用 -P 选项将配置文件名称作为参数传递。

C:\MVN\project>mvn test -Pnormal

C:\MVN\project>mvn test -Pprod

检查构建的输出以查看差异。

通过 Maven 设置激活配置文件

打开 %USER_HOME%/.m2 目录中的 Maven settings.xml文件,其中%USER_HOME%代表用户主目录。如果 settings.xml 文件不存在,则创建一个新文件。

使用活动配置文件节点将测试配置文件添加为活动配置文件,如下面的示例所示。

<settings 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/settings-1.0.0.xsd">
   <mirrors>
      <mirror>
         <id>maven.dev.snaponglobal.com</id>
         <name>Internal Artifactory Maven repository</name>
         <url>http://repo1.maven.org/maven2/</url>
         <mirrorOf>*</mirrorOf>
      </mirror>
   </mirrors>
   <activeProfiles>
      <activeProfile>test</activeProfile>
   </activeProfiles>
</settings>

现在打开命令控制台,转到包含 pom.xml 的文件夹并执行以下mvn命令。不要使用 -P 选项传递配置文件名称。Maven 将显示测试配置文件的结果是活动配置文件。

C:\MVN\project>mvn test

通过环境变量激活配置文件

现在从 Maven settings.xml 中删除活动配置文件并更新 pom.xml 中提到的测试配置文件。将激活元素添加到配置文件元素,如下所示。

当使用值“test”指定系统属性“env”时,将触发测试配置文件。创建环境变量“env”并将其值设置为“test”。

<profile>
   <id>test</id>
   <activation>
      <property>
         <name>env</name>
         <value>test</value>
      </property>
   </activation>
</profile>

让我们打开命令控制台,转到包含 pom.xml 的文件夹并执行以下mvn命令。

C:\MVN\project>mvn test

通过操作系统激活配置文件

包含操作系统详细信息的激活元素,如下所示。当系统为Windows XP时,此测试配置文件将触发。

<个人资料>
   <id>测试</id>
   <激活>
      <操作系统>
         <名称>Windows XP</名称>
         <系列>Windows</系列>
         <架构>x86</架构>
         <版本>5.1.2600</版本>
      </os>
   </激活>
</个人资料>

现在打开命令控制台,转到包含 pom.xml 的文件夹并执行以下mvn命令。不要使用 -P 选项传递配置文件名称。Maven 将显示测试配置文件的结果是活动配置文件。

C:\MVN\project>mvn test

通过现有/丢失文件激活配置文件

现在激活元素包括操作系统详细信息,如下所示。当target/ generated-sources/axistools/wsdl2java/com/companyname/group丢失时,测试配置文件将触发。

<profile>
   <id>test</id>
   <activation>
      <file>
         <missing>target/generated-sources/axistools/wsdl2java/
           com/companyname/group</missing>
      </file>
   </activation>
</profile>

现在打开命令控制台,转到包含 pom.xml 的文件夹并执行以下mvn命令。不要使用 -P 选项传递配置文件名称。Maven 将显示测试配置文件的结果是活动配置文件。

C:\MVN\project>mvn test

Maven - 存储库

什么是 Maven 存储库?

在 Maven 术语中,存储库是一个目录,其中存储所有项目 jar、库 jar、插件或任何其他项目特定工件,并且 Maven 可以轻松使用它们。

Maven 存储库分为三种类型。下图将给出关于这三种类型的想法。

  • 当地的
  • 中央
  • 偏僻的
存储库结构

本地存储库

Maven 本地存储库是您计算机上的文件夹位置。当您第一次运行任何 Maven 命令时,它就会被创建。

Maven 本地存储库保留项目的所有依赖项(库 jar、插件 jar 等)。当您运行 Maven 构建时,Maven 会自动将所有依赖项 jar 下载到本地存储库中。它有助于避免引用存储在远程机器上的依赖项