在Chapter 10, 构建生命周期中,你学习了生命周期可以通过打包类型定制。一个插件可以同时引入一个新的打包类型,并自定义该生命周期。在本节中,我们将会学习如果通过一个自定义的Maven插件来自定义生命周期。你同时也会看到如何让Mojo在平行的生命周期中执行。
让我们假设你编写了一些目标,它们依赖于前一个构建的输出。也许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
中定义。