目标和插件
生成工件的构建过程通常需要几个步骤和任务才能成功完成。这些任务的示例包括编译源代码,运行单元测试和打包工件。 Maven使用目标的概念来表示这样的粒度任务。
为了更好地理解一个目标是什么,让我们看一个例子。清单5-1显示了在c:\ apress \ gswm-book \ chapter5 \ gswm下的gswm项目代码上执行的编译目标。顾名思义,编译目标编译源代码。编译目标标识src / main / java下的Java类HelloWorld.java,编译它,并将编译的类文件放在target \ classes文件夹下。
列表5-1。 maven编译目标
C:\apress\gswm-book\chapter5\gswm>mvn compiler:compile Maven中的目标包装在插件中,这些插件本质上是一个或多个目标的集合。在清单5-1中,编译器是提供目标编译的插件。清单5-2介绍了一个名为clean的漂亮的目标。如前所述,目标文件夹保存Maven生成的临时文件和工件。有时候目标文件夹变得庞大,或者某些已经缓存的文件需要从文件夹中清除。干净的目标完全实现了,因为它试图删除目标文件夹及其所有内容。
清单5-2。 Maven干净的目标
注意,清单5-2中的命令的clean:clean后缀。清除之前的冒号(:)代表干净的插件,清除跟随冒号代表干净的目标。现在很明显,在命令行中运行目标需要以下语法:
mvn plugin_identifier:goal_identifier
可以使用pom.xml的插件部分配置插件及其行为。考虑你想强制你的项目必须用Java 1.6编译的情况。从3.0版本开始,Maven编译器插件会根据Java 1.5编译代码。因此,您需要在pom.xml文件中修改此插件的行为,如列表5-3所示。
列表5-3。插件元素在pom.xml文件中
现在如果你要运行mvn编译器:compile命令,生成的类文件将是Java版本1.6。
注意pom.xml中的<build />元素有一个非常有用的子元素,称为finalName。默认情况下,Maven生成的工件的名称遵循<< project_artifiact_id >> - << project_version >>格式。但是,有时您可能需要更改生成的工件的名称,而不更改artifactId。你可以通过声明finalName元素为<finalName> new_name </ finalName>来实现。
生命周期和阶段
Maven在构建,测试和分发工件时遵循良好定义的构建生命周期。生命周期构成以相同顺序执行的一系列阶段或步骤,与产生的伪像无关。 Maven将生命周期中的步骤称为阶段。 Maven有以下三个内置的生命周期:
默认值:此生命周期处理Maven项目的编译,打包和部署。
清除:此生命周期处理从目标目录删除临时文件和生成的工件。
站点:这个生命周期处理文档和站点生成的生成。
注意现在,您已经知道清洁生命周期,您只需通过使用命令mvn clean运行clean阶段就可以清理目标文件夹。
为了更好地理解构建生命周期及其阶段,让我们来看看与默认生命周期相关的一些阶段:
验证:运行检查以确保项目正确,并且所有依赖项都已下载并可用。
编译:编译源代码。
测试:使用框架运行单元测试。此步骤不需要打包应用程序。
包:将编译的代码汇编为可分发格式,例如JAR或WAR。
安装:将打包的归档安装到本地存储库中。该归档现在可供在该机器上运行的任何项目使用。
部署:将构建的存档推送到远程存储库,供其他团队和团队成员使用。
因为默认生命周期清楚地定义阶段的顺序,所以可以通过运行命令mvn package生成工件。 Maven将在所请求的阶段之前自动执行所有阶段。在提供的示例中,Maven将在运行包阶段之前运行阶段,如编译和测试。这意味着开发人员和配置管理器只需要学习和使用少数命令。
在每个阶段需要执行许多任务。为了实现这一点,每个阶段都与一个或多个目标相关联。阶段简单地将这些任务委派给它的相关目标。图5-1显示了生命周期,阶段,目标和插件之间的关联。
图5-1。生命周期,阶段,目标和插件之间的关联
pom.xml文件中的<packaged />元素将自动为每个阶段分配正确的目标,而无需任何其他配置。记住这是CoC的一个好处。如果包装元素包含值jar,则包阶段将绑定到jar插件中的jar目标。类似地,对于WAR工件,pom.xml将在war插件中将包绑定到war目标。
跳过测试
如前所述,当运行包阶段时,测试阶段也会运行,所有单元测试都会执行。如果测试阶段有任何故障,构建将失败。这是所需的行为。但是,有时候,例如,当处理遗留项目时,您希望跳过运行测试,以便可以成功构建项目。你可以使用maven.test.skip属性来实现。以下是使用此属性的示例:
mvn package -Dmaven.test.skip = true
插件开发
开发Maven的插件非常简单。本节介绍如何开发一个例子HelloPlugin,它将给你一个插件开发的味道。
如前所述,插件只是目标的集合。因此,当我们谈论插件开发时,我们基本上是在谈论开发目标。在Java中,这些目标使用MOJO实现,它代表Maven旧Java对象,类似于Java的普通旧Java对象(POJO)。
让我们通过创建一个名为gswm-plugin的Maven Java项目来开始这个插件开发,如图5-2所示。我们正在C:\ apress \ gswm-book \ chapter5文件夹中启动gswm-plugin项目下创建此项目。
图5-2。 Maven项目的插件开发
注意在本章中,我们手动创建插件项目。 Maven提供了一个mavan-archetype-mojo,它会启动你的插件开发。我们将在第6章中学习Maven原型。
pom.xml文件的内容如清单5-4所示。请注意,打包类型是maven-plugin。我们添加了maven-plugin-api依赖项,因为它是插件开发所必需的。
列表5-4。 pom.xml具有插件api依赖性
开发过程的下一步是创建MOJO。代码5-5显示了HelloMojo的代码。正如你所看到的,实现是简单的。我们使用Log实例将输出记录到控制台。这个代码的最重要的部分实际上是在Java注释部分:@goal hello。使用Javadoc标签@goal,我们将此目标的名称声明为hello。还可以使用Java 5注释,如@Mojo提供此元数据。但是,它需要在Apache Maven网站(http://maven.apache.org/plugin-tools/maven-plugin-plugin/examples/using-annotations.html)上讨论的pom.xml文件更改。
列表5-5。 HelloMojo Java类
列表5-6。 Maven安装命令
C:\apress\gswm-book\chapter5\gswm-plugin>mvn install
现在您可以开始使用此插件。请记住,运行任何目标的语法是mvn pluginId:goalId。代码清单5-7显示了这个插件在运行。请注意控制台上的Hello Maven Plugin文本。
列表5-7。运行Hello插件
总结
Maven使用基于插件的架构,使其功能可以轻松扩展。 每个插件是一个或多个目标的集合,可用于执行任务,如编译源代码或运行测试。 Maven将目标绑定到阶段。 相通常作为构建生命周期的一部分以序列执行。 您还学习了创建插件的基础知识。
在下一章中,您将介绍原型并了解多模块项目。