Maven 教程

Maven是一个强大的 Java 软件项目构建工具。实际上,您也可以使用其他语言构建软件项目,但 Maven 是用 Java 开发的,因此在历史上更多地用于 Java 项目。

本 Maven 教程的目的是让您了解 Maven 的工作原理。因此,本教程重点介绍 Maven 的核心概念。一旦理解了核心概念,就可以更轻松地在 Maven 文档中查找详细信息,或在 Internet 上进行搜索。

实际上,Maven 开发人员声称 Maven 不仅仅是一个构建工具。您可以在他们的文档《Philosophy of Maven》中阅读他们的看法。但现在,只需将其视为构建工具即可。一旦您理解并开始使用它,您就会发现 Maven 到底是什么。

Maven 版本

本 Maven 教程的第一个版本基于 Maven 3.6.3。

Maven 网站

Maven 网站位于:

http://maven.apache.org

您可以从该网站下载最新版本的 Maven 并大体上关注该项目。

什么是构建工具?

构建工具是一种自动化与构建软件项目相关的一切的工具。构建软件项目通常包括以下一项或多项活动:

  • 生成源代码(如果项目中使用了自动生成的代码)。
  • 从源代码生成文档。
  • 编译源代码。
  • 将编译后的代码打包成 JAR 文件或 ZIP 文件。
  • 在服务器、存储库或其他地方安装打包代码。

任何给定的软件项目可能有比构建最终软件所需的活动更多的活动。这些活动通常可以插入到构建工具中,因此这些活动也可以自动化。

自动化构建过程的优势在于,您可以将手动构建软件时人为出错的风险降至最低。此外,自动构建工具通常比人工执行相同步骤更快。

安装 Maven

要在您自己的系统(计算机)上安装 Maven,请转到Maven 下载页面 并按照那里的说明进行操作。总之,您需要做的是:

  1. JAVA_HOME环境变量设置为指向有效的 Java SDK(例如 Java 8)。
  2. 下载并解压 Maven。
  3. M2_HOME环境变量设置为指向您将 Maven 解压缩到的目录。
  4. M2环境变量设置为指向M2_HOME/bin (%M2_HOME%\bin在 Windows 上,$M2_HOME/bin在 unix 上)。
  5. 添加M2PATH环境变量(%M2%在 Windows 上,$M2在 unix 上)。
  6. 打开命令提示符并键入“ mvn -version”(不带引号),然后按 Enter。

输入mvn -version命令后,您应该能够看到 Maven 执行,并且 Maven 的版本号写到命令提示符中。

注意:Maven 在执行时使用 Java,因此您还需要安装 Java(以及JAVA_HOME如上所述设置的环境变量)。Maven 3.0.5 需要 Java 1.5 或更高版本。我将 Maven 3.3.3 与 Java 8 (u45) 结合使用。

如果您不熟悉, 我有一个关于安装 Java SDK的教程。请记住,它必须是一个 SDK(软件开发工具包),而不仅仅是一个 JRE(Java 运行时环境)。JRE 不包含 Java 编译器。只有 SDK 可以。

Maven 概述 – 核心概念

Maven 以 POM 文件(项目对象模型)的概念为中心。POM 文件是项目资源的 XML 表示,如源代码、测试代码、依赖项(使用的外部 JAR)等。POM 包含对所有这些资源的引用。POM 文件应位于其所属项目的根目录中。

下图说明了 Maven 如何使用 POM 文件,以及 POM 文件主要包含的内容:

Maven 核心概念概述

这些概念在下面进行了简要说明,以便为您提供一个概述,然后在本教程后面的各自部分中进行更详细的介绍。

POM 文件
当你执行 Maven 命令时,你给了 Maven 一个 POM 文件来执行命令。然后 Maven 将对 POM 中描述的资源执行命令。

构建生命周期、阶段和目标
Maven 中的构建过程分为构建生命周期、阶段和目标。构建生命周期由一系列构建阶段组成,每个构建阶段由一系列目标组成。当您运行 Maven 时,您将命令传递给 Maven。此命令是构建生命周期、阶段或目标的名称。如果请求执行生命周期,则执行该生命周期中的所有构建阶段。如果请求执行一个构建阶段,那么在构建阶段的预定义序列中它之前的所有构建阶段也会被执行。

依赖关系和存储库
Maven 执行的首要目标之一是检查项目所需的依赖关系。依赖项是项目使用的外部 JAR 文件(Java 库)。如果在本地 Maven 存储库中找不到依赖项,Maven 会从中央 Maven 存储库下载它们并将它们放入本地存储库。本地存储库只是您计算机硬盘上的一个目录。如果需要,您可以指定本地存储库的位置(我愿意)。您还可以指定使用哪个远程存储库来下载依赖项。所有这些都将在本教程的后面部分进行更详细的解释。

构建插件
构建插件用于将额外的目标插入构建阶段。如果您需要为您的项目执行一组标准 Maven 构建阶段和目标未涵盖的操作,您可以向 POM 文件添加一个插件。Maven 有一些您可以使用的标准插件,如果需要,您也可以用 Java 实现自己的插件。

构建配置
文件如果您需要以不同方式构建项目,则使用构建配置文件。例如,您可能需要为本地计算机构建项目,以进行开发和测试。您可能需要构建它以便在您的生产环境中进行部署。这两个构建可能不同。要启用不同的构建,您可以将不同的构建配置文件添加到您的 POM 文件中。执行 Maven 时,您可以知道要使用哪个构建配置文件。

Maven 与 Ant

Ant 是 Apache 的另一个流行的构建工具。如果您习惯了 Ant 而正在尝试学习 Maven,您会注意到这两个项目的方法有所不同。

Ant 使用命令式方法,这意味着您在 Ant 构建文件中指定 Ant 应该执行的操作。您可以指定低级操作,如复制文件、编译代码等。您指定操作,还指定它们执行的顺序。Ant 没有默认的目录布局。

Maven 使用更具声明性的方法,这意味着您在 Maven POM 文件中指定要构建什么 ,而不是如何构建它。POM 文件描述了您的项目资源——而不是如何构建它。相反,Ant 文件描述了如何构建项目。在 Maven 中,如何构建项目是在Maven Build Life Cycles, Phases and Goals中预定义的。

Maven POM 文件

Maven POM 文件(项目对象模型)是描述项目资源的 XML 文件。这包括源代码、测试源等所在的目录,您的项目有哪些外部依赖项(JAR 文件)等。

POM 文件描述了构建什么,但通常没有描述如何构建它。如何构建它取决于 Maven 构建阶段和目标。不过,如果需要,您可以将自定义操作(目标)插入 Maven 构建阶段。

每个项目都有一个 POM 文件。POM 文件已命名pom.xml,应位于项目的根目录中。一个项目被分成多个子项目,通常父项目有一个 POM 文件,每个子项目都有一个 POM 文件。这种结构既允许一步构建整个项目,也允许单独构建任何子项目。

在本节的其余部分,我将描述 POM 文件中最重要的部分。有关 POM 文件的完整参考,请参阅Maven POM 参考

这是一个最小的 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.jenkov< /groupId> 
    <artifactId>java-web-crawler</artifactId> 
    <version>1.0.0</version> 
</project>

modelVersion元素设置您正在使用的 POM 模型版本。使用与您正在使用的 Maven 版本相匹配的版本。版本 4.0.0 匹配 Maven 版本 2 和 3。

groupId元素是组织或项目(例如开源项目)的唯一 ID。大多数情况下,您会使用类似于项目的根 Java 包名称的组 ID。例如,对于我的 Java Web Crawler 项目,我可能会选择组 ID com.jenkov。如果该项目是一个有许多独立贡献者的开源项目,使用与该项目相关的组 ID 可能比使用与我公司相关的组 ID 更有意义。因此,com.javawebcrawler可以使用。

组 ID 不必是 Java 包名称,也不需要使用 . 用于分隔 ID 中单词的符号(点符号)。但是,如果您这样做,该项目将位于 Maven 存储库中与组 ID 匹配的目录结构下。每个 。替换为目录分隔符,因此每个单词代表一个目录。然后组 IDcom.jenkov将位于名为MAVEN_REPO/com/jenkov. 目录名称的 MAVEN_REPO部分将替换为 Maven 存储库的目录路径。

artifactId元素包含您正在构建的项目的名称。对于我的 Java Web Crawler 项目,工件 ID 为java-web-crawler. 工件 ID 用作 Maven 存储库中组 ID 目录下子目录的名称。工件 ID 还用作构建项目时生成的 JAR 文件名称的一部分。构建过程的输出,即构建结果,在 Maven 中称为工件。大多数情况下,它是 JAR、WAR 或 EAR 文件,但也可以是其他文件。

versionId元素包含项目的版本号。如果您的项目以不同的版本发布,例如开源 API,那么对构建进行版本控制很有用。这样,您项目的用户就可以引用您项目的特定版本。版本号用作工件 ID 目录下子目录的名称。版本号也用作构建的工件名称的一部分。

上面的groupId,artifactIdversion元素将生成一个 JAR 文件,并将其放入位于以下路径(目录和文件名)的本地 Maven 存储库中:

MAVEN_REPO/com/jenkov/java-web-crawler/1.0.0/java-web-crawler-1.0.0.jar

如果你的项目使用Maven 目录结构,并且你的项目没有外部依赖,那么上面的最小 POM 文件就是你构建项目所需要的。

如果你的项目不遵循标准的目录结构,有外部依赖,或者在构建过程中需要特殊操作,你就需要在POM文件中添加更多的元素。这些元素在 Maven POM 参考中列出(参见上面的链接)。

通常,您可以在 POM 中指定很多内容,从而为 Maven 提供有关如何构建项目的更多详细信息。有关可以指定的内容的更多信息,请参阅 Maven POM 参考。

Super POM

所有 Maven POM 文件都继承自超级 POM。如果没有指定超级 POM,则 POM 文件继承自基础 POM。这是一个图表说明:

超级POM和POM继承

您可以使一个 POM 文件显式继承自另一个 POM 文件。这样你就可以通过它们的通用超级 POM 更改所有继承 POM 的设置。您可以像这样在 POM 文件的顶部指定超级 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>
    
        <parent>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>my-parent</artifactId>
        <version>2.0</version>
        <relativePath>../my-parent</relativePath>
        </parent>
    

    <artifactId>my-project</artifactId>
    ...
</project>

继承的 POM 文件可能会覆盖来自超级 POM 的设置。只需在继承 POM 文件中指定新设置。

POM 继承在 Maven POM 参考中也有更详细的介绍。

有效的POM

有了所有这些 POM 继承,可能很难知道 Maven 执行时整个 POM 文件是什么样子的。整个 POM 文件(所有继承的结果)称为有效 POM。您可以使用以下命令让 Maven 向您显示有效的 POM:

mvn help:effective-pom

此命令将使 Maven 将有效的 POM 写出到命令行提示符。

Maven 设置文件

Maven 有两个设置文件。在设置文件中,您可以跨所有 Maven POM 文件配置 Maven 的设置。例如,您可以配置:

  • 本地存储库的位置
  • 活动构建配置文件
  • 等等。

设置文件称为settings.xml. 这两个设置文件位于:

  • Maven安装目录:$M2_HOME/conf/settings.xml
  • 用户的主目录:${user.home}/.m2/settings.xml

这两个文件都是可选的。如果这两个文件都存在,则用户主设置文件中的值将覆盖 Maven 安装设置文件中的值。

您可以在Maven 设置参考 中阅读有关 Maven 设置文件的更多信息。

运行 Maven

当你安装了 Maven并创建了一个POM 文件 并将 POM 文件放在你的项目的根目录下,你就可以在你的项目上运行 Maven 了。

运行 Maven 是通过mvn从命令提示符执行命令来完成的。执行mvn命令时,您将构建生命周期、阶段或目标的名称传递给它,Maven 然后执行该命令。这是一个例子:

mvn install

此命令执行名为installdefault构建生命周期的一部分)的构建阶段,该阶段构建项目并将打包的 JAR 文件复制到本地 Maven 存储库中。实际上,此命令在执行构建阶段之前install 执行构建阶段序列中之前的所有install构建阶段。

您可以通过将多个参数传递给mvn命令来执行多个构建生命周期或阶段。这是一个例子:

 mvn clean install

此命令首先执行clean构建生命周期,从 Maven 输出目录中删除已编译的类,然后执行install构建阶段。

您还可以通过传递构建阶段和目标名称(中间用 : 连接)作为 Maven 命令的参数来执行 Maven 目标(构建阶段的子部分)。这是一个例子:

mvn dependency:copy-dependencies

此命令执行构建阶段 的copy-dependencies目标。dependency

Maven 目录结构

Maven 有一个标准的目录结构。如果您的项目遵循该目录结构,则无需在 POM 文件中指定源代码、测试代码等的目录。

我在这里更详细地介绍了 Maven 目录结构:Maven 目录结构。

以下是最重要的目录:

- src
  - main
    - java
    - resources
    - webapp
  - test
    - java
    - resources

- target

src目录是您的源代码和测试代码的根目录。该main目录是与应用程序本身相关的源代码(不是测试代码)的根目录。该test目录包含测试源代码。和下的java目录 包含应用程序本身的 Java 代码(在 下)和测试的 Java 代码(在测试中)。 maintestmain

resources目录包含项目所需的其他资源。这可能是用于应用程序国际化或其他内容的属性文件。

如果您的项目是 Web 应用程序,该webapp目录包含您的 Java Web 应用程序。该webapp目录将成为 Web 应用程序的根目录。因此webapp目录包含WEB-INF目录等。

target目录由 Maven 创建。它包含 Maven 生成的所有编译类、JAR 文件等。在执行clean 构建阶段时,它是target被清理的目录。

项目依赖

除非您的项目很小,否则您的项目可能需要打包在自己的 JAR 文件中的外部 Java API 或框架。编译项目代码时,类路径中需要这些 JAR 文件。

使用这些外部 JAR 文件的正确版本使您的项目保持最新可能是一项综合性任务。每个外部 JAR 可能还需要其他外部 JAR 文件等。递归下载所有这些外部依赖项(JAR 文件)并确保下载正确的版本是很麻烦的。尤其是当你的项目变大时,你会得到越来越多的外部依赖。

幸运的是,Maven 具有内置的依赖管理。您在 POM 文件中指定您的项目依赖哪些外部库,以及哪个版本,然后 Maven 会为您下载它们并将它们放在您本地的 Maven 存储库中。如果这些外部库中的任何一个需要其他库,那么这些其他库也会下载到您的本地 Maven 存储库中。

dependencies在 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.jenkov.crawler</groupId>
    <artifactId>java-web-crawler</artifactId>
    <version>1.0.0</version>
    
      <dependencies>

        <dependency>
          <groupId>org.jsoup</groupId>
          <artifactId>jsoup</artifactId>
          <version>1.7.1</version>
        </dependency>

        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.8.1</version>
          <scope>test</scope>
        </dependency>

      </dependencies>
    

    <build>
    </build>

</project>

注意dependencies粗体元素。它里面有两个dependency 元素。每个dependency元素都描述了一个外部依赖项。

每个依赖项都由其groupId,artifactId和描述version。您可能还记得,这也是您在 POM 文件开头标识自己的项目的方式。上面的示例需要version 中的组的工件,以及 versionorg.jsoup中的组的工件。 jsoup1.7.1junitjunit4.8.1

当 Maven 执行此 POM 文件时,这两个依赖项将从中央 Maven 存储库下载并放入本地 Maven 存储库。如果依赖项已经在您的本地存储库中找到,Maven 将不会下载它们。只有在缺少依赖项时才会将它们下载到您的本地存储库中。

有时给定的依赖项在中央 Maven 存储库中不可用。然后您可以自己下载依赖项并将其放入本地 Maven 存储库。请记住将其放入与groupId,artifactId和匹配的子目录结构中version。将所有点 (.) 替换为 / 并将groupId,artifactId和/ 分开version 。然后你有你的子目录结构。

上面例子下载的两个依赖会放到如下子目录:

MAVEN_REPOSITORY_ROOT/junit/junit/4.8.1
MAVEN_REPOSITORY_ROOT/org/jsoup/jsoup/1.7.1

外部依赖

Maven 中的外部依赖项是不位于 Maven 存储库(本地、中央或远程存储库)中的依赖项(JAR 文件)。它可能位于本地硬盘上的某处,例如在libweb 应用程序的目录中,或其他地方。因此,“外部”一词意味着 Maven 存储库系统的外部——而不仅仅是项目的外部。大多数依赖项在项目外部,但很少在存储库系统外部(不位于存储库中)。

您配置这样的外部依赖项:

<dependency>
  <groupId>mydependency</groupId>
  <artifactId>mydependency</artifactId>
  <scope>system</scope>
  <version>1.0</version>
  <systemPath>${basedir}\war\WEB-INF\lib\mydependency.jar</systemPath>
</dependency>

groupIdartifactId设置为依赖项的名称。使用的 API 的名称,即。scope元素值设置system为。该systemPath元素设置为指向包含依赖项的 JAR 文件的位置。${basedir}指向 POM 所在的目录。路径的其余部分是该目录的相对路径。

快照依赖

快照依赖项是正在开发中的依赖项(JAR 文件)。您可以依赖项目的快照版本,而不是不断更新版本号以获得最新版本。每个构建的快照版本总是下载到您的本地存储库中,即使匹配的快照版本已经位于您的本地存储库中。始终下载快照依赖项可确保您在本地存储库中始终拥有每个构建的最新版本。

您可以告诉 Maven 您的项目是一个快照版本,只需-SNAPSHOT 在 POM 的开头附加版本号(您还设置了groupId和 artifactId)。这是一个version元素示例:

<version>1.0-SNAPSHOT</version>

请注意-SNAPSHOT附加到版本号。

取决于快照版本也可以通过-SNAPSHOT 在配置依赖项时在版本号后附加来完成。这是一个例子:

<dependency>
    <groupId>com.jenkov</groupId>
    <artifactId>java-web-crawler</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

-SNAPSHOT附加到数字 的version告诉 Maven 这是一个快照版本。

您可以在Maven 设置文件中配置 Maven 下载快照依赖项的频率。

传递依赖

如果您的项目依赖于一个依赖项,例如 Dependency ABC,而 Dependency ABC 本身又依赖于另一个依赖项,例如 Dependency XYZ,那么您的项目对 Dependency XYZ 具有传递依赖性

排除依赖

有时你的项目的直接依赖可能会与直接依赖的传递依赖发生冲突。例如,您可能正在使用 JAX-RS 实现,它在内部使用旧版本的Jackson JSON Toolkit。但是,您的应用程序可能正在使用更新版本的 Jackson JSON Toolkit。您如何知道将使用这两个版本中的哪一个?

一种解决方案是为 JAX-RS 依赖项指定应排除其对旧版本 Jackson JSON Toolkit 的依赖项。这也称为依赖项排除

您在要排除的传递依赖项的依赖项声明中指定依赖项排除项。下面是声明 Maven 依赖项排除的示例:

<dependency>
  <groupId>example.jaxrs</groupId>
  <artifactId>JAX-RS-TOOLKIT</artifactId>
  <version>1.0</version>
  <scope>compile</scope>
  <exclusions>
    <exclusion>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>

有了这个依赖项排除声明,无论包含排除项的依赖项使用的是什么版本的排除项,在 Maven 编译项目期间都将被忽略。

Maven 存储库

Maven 存储库是包含额外元数据的打包 JAR 文件的目录。元数据是 POM 文件,描述每个打包的 JAR 文件所属的项目,包括每个打包的 JAR 具有哪些外部依赖项。正是这种元数据使 Maven 能够递归地下载依赖项的依赖项,直到下载了整个依赖项树并将其放入本地存储库。

Maven 存储库在 Maven 存储库简介 中有更详细的介绍,但这里是一个快速概述。

Maven 有三种类型的存储库:

  • Local repository
  • Central repository
  • Remote repository
  • 本地存储库
  • 中央资料库
  • 远程仓库

Maven 按上述顺序在这些存储库中搜索依赖项。首先在本地存储库中,然后在中央存储库中,如果在 POM 中指定,第三个在远程存储库中。

下图说明了三种存储库类型及其位置:

Maven 存储库类型和位置

本地存储库
本地存储库是开发人员计算机上的一个目录。这个存储库将包含 Maven 下载的所有依赖项。同一个 Maven 存储库通常用于多个不同的项目。因此 Maven 只需要下载依赖项一次,即使有多个项目依赖它们(例如 Junit)。

mvn install您也可以使用命令 在本地存储库中构建和安装您自己的项目 。这样,您的其他项目就可以将您自己项目的打包 JAR 文件用作外部依赖项,方法是在它们的 Maven POM 文件中将它们指定为外部依赖项。

默认情况下,Maven 将本地存储库放在本地计算机上的用户主目录中。但是,您可以通过在 Maven 设置文件中设置目录来更改本地存储库的位置。您的 Maven 设置文件也位于您的user-home/.m2目录中,名为 settings.xml. 以下是为本地存储库指定另一个位置的方法:

<settings>
    <localRepository>
        d:\data\java\products\maven\repository
    </localRepository>
</settings>

中央资料库

中央 Maven 存储库是由 Maven 社区提供的存储库。默认情况下,Maven 会在这个中央存储库中查找任何需要但在本地存储库中找不到的依赖项。然后 Maven 将这些依赖项下载到您的本地存储库中。您无需特殊配置即可访问中央存储库。

远程存储库
远程存储库是 Web 服务器上的存储库,Maven 可以从中下载依赖项,就像中央存储库一样。远程存储库可以位于 Internet 上的任何位置,也可以位于本地网络内。

远程存储库通常用于托管组织内部的项目,这些项目由多个项目共享。例如,一个公共安全项目可能会在多个内部项目中使用。这个安全项目不应该被外界访问,因此不应该托管在公共的中央 Maven 存储库中。相反,它可以托管在内部远程存储库中。

在远程存储库中找到的依赖项也会由 Maven 下载并放入您的本地存储库。

您可以在 POM 文件中配置远程存储库。将以下 XML 元素放在该元素之后<dependencies>

<repositories>
   <repository>
       <id>jenkov.code</id>
       <url>http://maven.jenkov.com/maven2/lib</url>
   </repository>
</repositories>

Maven 构建生命周期、阶段和目标

当 Maven 构建软件项目时,它遵循构建生命周期。构建生命周期分为构建阶段,构建阶段又分为构建目标。Maven 构建生命周期、构建阶段和目标在Maven 构建阶段简介中有更详细的描述 ,但在这里我会给你一个快速概述。

构建生命周期
Maven 有 3 个内置的构建生命周期。这些是:

  1. default
  2. clean
  3. site

这些构建生命周期中的每一个都负责构建软件项目的不同方面。因此,这些构建生命周期中的每一个都是彼此独立执行的。您可以让 Maven 执行多个构建生命周期,但它们将按顺序执行,彼此分开,就好像您执行了两个单独的 Maven 命令一样。

default生命周期处理与编译和打包项目相关的所有事情 。clean生命周期处理与从输出目录中删除临时文件相关的一切,包括生成的源文件、编译的类、以前的 JAR 文件等。生命site 周期处理与为项目生成文档相关的一切。事实上,site可以为您的项目生成一个带有文档的完整网站。

构建阶段
每个构建生命周期都分为一系列构建阶段,构建阶段又细分为目标。因此,整个构建过程是构建生命周期、构建阶段和目标的序列。

您可以执行整个构建生命周期(如cleansite)、构建阶段(如构建生命周期install的一部分default)或构建目标(如dependency:copy-dependencies. 注意:您不能 default直接执行生命周期。default您必须在生命周期 内指定构建阶段或目标 。

当您执行构建阶段时,将执行此标准阶段序列中该构建阶段之前的所有构建阶段。因此,执行install构建阶段实际上意味着执行该阶段之前的所有构建阶段install,然后执行该install 阶段之后的阶段。

生命default周期是最令人感兴趣的,因为它是构建代码的基础。由于您不能default直接执行生命周期,因此您需要从生命周期中执行构建阶段或目标default。生命default周期有一系列广泛的构建阶段和目标,所以我不会在这里描述它们。最常用的构建阶段是:

建造阶段描述
validate验证项目是否正确以及所有必要信息是否可用。这也确保下载了依赖项。
compile编译项目的源代码。
test使用合适的单元测试框架对编译后的源代码运行测试。这些测试不应要求打包或部署代码。
package将编译后的代码打包成可分发的格式,例如 JAR。
install将包安装到本地存储库中,以用作本地其他项目的依赖项。
deploy将最终包复制到远程存储库,以便与其他开发人员和项目共享。

您可以通过将其名称传递给mvn命令来执行这些构建阶段之一。这是一个例子:

mvn package

此示例执行package构建阶段,因此也执行 Maven 预定义构建阶段序列中它之前的所有构建阶段。

如果标准 Maven 构建阶段和目标不足以构建您的项目,您可以创建 Maven 插件来添加您需要的额外构建功能。

构建目标
构建目标是 Maven 构建过程中最好的步骤。一个目标可以绑定到一个或多个构建阶段,或者根本不绑定。如果目标未绑定到任何构建阶段,则只能通过将目标名称传递给mvn命令来执行它。如果目标绑定到多个构建阶段,则该目标将在它绑定到的每个构建阶段中执行。

Maven 构建配置文件

Maven 构建配置文件使您能够使用不同的配置构建项目。无需创建两个单独的 POM 文件,您只需指定一个具有不同构建配置的配置文件,并在需要时使用此构建配置文件构建您的项目。

您可以在Profiles 下的 Maven POM 参考中阅读有关构建配置文件的完整故事。在这里,我会给你一个快速的概述。

Maven 构建配置文件在 POM 文件内指定,在profiles元素内。每个构建配置文件都嵌套在一个profile元素中。这是一个例子:

<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.jenkov.crawler</groupId>
  <artifactId>java-web-crawler</artifactId>
  <version>1.0.0</version>

  <profiles>
      <profile>
          <id>test</id>
          <activation>...</activation>
          <build>...</build>
          <modules>...</modules>
          <repositories>...</repositories>
          <pluginRepositories>...</pluginRepositories>
          <dependencies>...</dependencies>
          <reporting>...</reporting>
          <dependencyManagement>...</dependencyManagement>
          <distributionManagement>...</distributionManagement>
      </profile>
  </profiles>

</project>

构建配置文件描述了在该构建配置文件下执行时应该对 POM 文件进行哪些更改。这可能是更改要使用的应用程序配置文件等。元素内的profile元素将覆盖 POM 中具有相同名称的元素的值。

profile元素内部,您可以看到一个activation元素。此元素描述触发此构建配置文件被使用的条件。选择正在执行的配置文件的一种方法是在settings.xml文件中。您可以在那里设置活动配置文件。另一种方法是添加-P profile-name到 Maven 命令行。有关详细信息,请参阅配置文件文档。

Maven 插件

Maven 插件使您能够将自己的操作添加到构建过程中。为此,您可以创建一个简单的 Java 类来扩展一个特殊的 Maven 类,然后为该项目创建一个 POM。该插件应位于其自己的项目中。

为了使本教程简短,我将参考Maven 插件开发人员中心 以获取有关开发插件的更多信息。

Next:

你的第一个 Maven 项目