Maven文档翻译

官方文档:http://maven.apache.org/guides/

1.Maven入门

2.引言

2.1构建生命周期简介

Maven基于构建生命周期的中心概念。 这意味着已明确定义了构建和分发特定工件(项目)的过程。

对于构建项目的人来说,这意味着仅需学习少量命令即可构建任何Maven项目,并且POM将确保它们获得所需的结果。

有三个内置的构建生命周期:默认(default),清除(clean)和站点(site)。 默认生命周期处理项目部署,清理生命周期处理项目清理,而站点生命周期处理项目的站点文档的创建。

这些构建生命周期中的每一个都由不同的构建阶段列表定义,其中,构建阶段代表生命周期中的一个阶段。

例如,默认生命周期包含以下阶段(有关生命周期阶段的完整列表,请参阅《生命周期参考》):

  • validate - 验证项目是否正确并且所有必要的信息均可用
  • compile - 编译项目的源代码
  • test - 使用合适的单元测试框架测试编译后的源代码。 这些测试不应要求将代码打包或部署
  • package - 获取编译后的代码,并将其打包为可分发格式,例如JAR。
  • verify - 对集成测试的任何结果进行检查,以确保符合质量标准
  • install - 将软件包安装到本地存储库中,以作为本地其他项目中的依赖项
  • deploy - 在构建环境中完成后,将最终程序包复制到远程存储库,以便与其他开发人员和项目共享。

这些生命周期阶段(加上此处未显示的其他生命周期阶段)将顺序执行以完成默认生命周期。 给定上面的生命周期阶段,这意味着当使用默认生命周期时,Maven将首先验证项目,然后尝试编译源代码,针对测试运行源代码,打包二进制文件(例如jar),针对该源运行集成测试 软件包,验证集成测试,将经过验证的软件包安装到本地存储库,然后将已安装的软件包部署到远程存储库。

2.2常规命令行调用

您应该选择与您的结果相匹配的阶段。 如果需要jar,请运行package。 如果要运行单元测试,请运行test。

如果您不确定自己想要什么,则首选的呼叫阶段是

  1. mvn verify

在执行验证之前,此命令按顺序执行每个默认生命周期阶段(验证,编译,打包等)。 您只需要调用要执行的最后一个构建阶段,在这种情况下,请进行验证。 在大多数情况下,效果与包装相同。 但是,如果有集成测试,则也将执行这些测试。 在验证阶段,可以进行一些其他检查,例如 如果您的代码是根据预定义的checkstyle规则编写的。

在构建环境中,使用以下调用将构件干净地构建并部署到共享存储库中。

  1. mvn clean deploy

可以在多模块方案中使用同一命令(即,一个或多个子项目的项目)。 Maven遍历每个子项目并执行干净操作,然后执行部署(包括所有先前的构建阶段步骤)。

2.3构建阶段由插件目标组成

但是,即使构建阶段负责构建生命周期中的特定步骤,执行这些职责的方式也可能有所不同。 这是通过声明与这些构建阶段绑定的插件目标来完成的。

插件目标代表一个特定的任务(比构建阶段还完善),该任务有助于项目的构建和管理。 它可能会绑定到零个或多个构建阶段。 可以通过直接调用在构建生命周期之外执行不受任何构建阶段约束的目标。 执行的顺序取决于调用目标和构建阶段的顺序。 例如,考虑以下命令。 clean和package参数是构建阶段,而dependency:copy-dependencies是(或一个插件)目标。

  1. mvn clean dependency:copy-dependencies package

如果要执行此操作,则将首先执行clean阶段(这意味着它将运行clean生命周期的所有先前阶段,再加上clean阶段本身),然后执行dependency:copy-dependencies目标,最后执行程序包阶段 (以及默认生命周期的所有之前的构建阶段)。

此外,如果目标绑定到一个或多个构建阶段,则将在所有这些阶段中调用该目标。

此外,构建阶段还可以绑定零个或多个目标。 如果构建阶段没有目标绑定,则该构建阶段将不会执行。 但是,如果绑定了一个或多个目标,它将执行所有这些目标。

(注意:在Maven 2.0.5及更高版本中,绑定到某个阶段的多个目标将按照在POM中声明的顺序执行,但是不支持同一插件的多个实例。同一插件的多个实例被分组 一起执行并在Maven 2.0.11及更高版本中排序)。

2.4通常不从命令行调用某些阶段

通常不从命令行直接调用以连字词命名的阶段(pre-,post- 或process- *)。这些阶段对构建进行排序,产生中间结果,这些结果在构建外部无用。在进行集成测试的情况下,环境可能处于挂起状态。

Jacoco等代码覆盖工具和Tomcat,Cargo和Docker等执行容器插件将目标绑定到集成前测试阶段,以准备集成测试容器环境。这些插件还将目标绑定到集成测试后阶段,以收集覆盖率统计信息或停用集成测试容器。

故障安全和代码覆盖插件将目标绑定到集成测试和验证阶段。最终结果是测试,验证阶段之后将提供覆盖率报告。如果要从命令行调用Integration-test,则不会生成任何报告。更糟糕的是,集成测试容器环境处于挂起状态; Tomcat Web服务器或Docker实例保持运行状态,并且Maven甚至无法自行终止。

3.设置项目以使用构建生命周期

构建生命周期使用起来很简单,但是当您为项目构建Maven构建时,如何为每个构建阶段分配任务呢?

3.1打包

第一种也是最常见的方法是通过同名的POM元素<packaging>设置项目的包装。 一些有效的包装值是jarwarearpom。 如果未指定包装值,则默认为jar

每个包装都包含要绑定到特定阶段的目标列表。 例如,jar包装将绑定以下目标以构建默认生命周期的各个阶段。

Phase plugin:goal
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar
install install:install
deploy deploy:deploy

这是一套几乎标准的绑定。 但是,有些包装对它们的处理方式有所不同。 例如,纯粹是元数据(打包值为pom)的项目仅将目标绑定到安装和部署阶段(有关某些打包类型的目标到构建阶段绑定的完整列表,请参阅《生命周期参考》)。 )。

请注意,要使某些包装类型可用,您可能还需要在POM的<build>部分中包括一个特定的插件,并为该插件指定<extensions> true </ extensions>。 需要此插件的一个示例是Plexus插件,它提供了plexus-applicationplexus-service打包。

3.2插件

向阶段添加目标的第二种方法是在项目中配置插件。插件是为Maven提供目标的构件。此外,插件可以具有一个或多个目标,其中每个目标代表该插件的能力。例如,编译器插件有两个目标:compiletestCompile。前者编译您的主代码的源代码,而后者编译您的测试代码的源代码。

正如您将在后面的部分中看到的那样,插件可以包含指示目标绑定到哪个生命周期阶段的信息。请注意,仅添加插件是不够的信息-您还必须指定要在构建过程中运行的目标。

已配置的目标将从所选包装中添加到已经绑定到生命周期的目标中。如果在一个特定阶段上绑定了多个目标,则使用的顺序是先执行包装中的目标,然后执行POM中配置的目标。请注意,您可以使用<executions>元素来更好地控制特定目标的顺序。

例如,默认情况下,Modello插件将其目标modello:java绑定到generate-sources阶段(注意:modello:java目标生成Java源代码)。因此,要使用Modello插件并使其从模型生成源并将其合并到构建中,可以在<build><plugins>部分中将以下内容添加到POM中:

  1. ...
  2. <plugin>
  3. <groupId>org.codehaus.modello</groupId>
  4. <artifactId>modello-maven-plugin</artifactId>
  5. <version>1.8.1</version>
  6. <executions>
  7. <execution>
  8. <configuration>
  9. <models>
  10. <model>src/main/mdo/maven.mdo</model>
  11. </models>
  12. <version>4.0.0</version>
  13. </configuration>
  14. <goals>
  15. <goal>java</goal>
  16. </goals>
  17. </execution>
  18. </executions>
  19. </plugin>
  20. ...