17.6. 插件和Maven生命周期

Chapter 10, 构建生命周期中,你学习了生命周期可以通过打包类型定制。一个插件可以同时引入一个新的打包类型,并自定义该生命周期。在本节中,我们将会学习如果通过一个自定义的Maven插件来自定义生命周期。你同时也会看到如何让Mojo在平行的生命周期中执行。

17.6.1. 执行平行的生命周期

让我们假设你编写了一些目标,它们依赖于前一个构建的输出。也许ZipMojo目标只有在拥有归档输出的前提下才能运行。你可以使用Mojo类的@execute注解来指定这样的前置目标。该注解会让Maven生成一个平行的构建,并在这个平行的Maven实例中执行一个目标或者生命周期,该运行并不会影响当前构建。也许你编写了一个Mojo,它每天只运行一次,它首先会运行mvn install,然后将所有的输出打包至某种自定义的分发格式。你的Mojo描述符可以告诉Maven,在运行这个自定义Mojo之前,你想要运行默认生命周期的所有直到install的阶段,然后以属性${executedProject}的形式将项目结果暴露给你的Mojo。然后你就可以在进行某种后期处理之前引用那个项目的属性。

另一种可能性是,你有一个目标做一些与默认生命周期完全无关的工作。让我们考虑这样一个例子,你有一个目标使用LAME将WAV文件转换成MP3,但在这之前你需要运行一个生命周期,将MIDI文件转换成WAV。(你可以用Maven做任何事,这里的例子并没有太“离谱”)你已经创建了一个“midi-sound”生命周期,现在你想要包含midi-sound生命周期install阶段的输出,而现在你自己的web应用项目的打包类型是war。由于你的项目在war打包类型生命周期运行,你需要让mojo能够fork一个完全独立的,使用midi-sound的生命周期。你可以通过在你的mojo上添加注解@execute lifecycle="midi-source" phase="install"来达到这样的目的。

@execute goal="<goal>"

会在执行当前目标之前运行声明的目标。目标名称使用prefix:goal标记指定。

@execute phase="<phase>"

在执行当前生命周期之前,fork出另一个构建生命周期(直到指定的阶段)。如果没有指定生命周期,Maven会使用当前构建的生命周期。

@execute lifecycle="<lifecycle>" phase="<phase>"

会执行给定的生命周期。自定义的生命周期可以在META-INF/maven/lifecycle.xml中定义。