17.6.3. 覆盖默认生命周期

你已经创建了自己的生命周期,并能在一个Mojo中将其衍生使用。下一个你可能要问的问题是,如何覆盖默认的生命周期。如何如何创建定制的生命周期并将其绑定到项目上?在Chapter 10, 构建生命周期中,我们看到了项目的打包类型定义了项目的生命周期。所有打包类型都有差异;war绑定不同的目标到package阶段,自定义的生命周期如来自Israfil Flex 3的swf绑定不同的目标到compile阶段。在你创建自定义生命周期的时候,你可以通过为插件提供一些Plexus配置,将生命周期绑定到特定的打包类型。

要为新的生命周期定义新的打包类型,你需要配置Plexus中的LifecycleMapping组件。在你的插件项目中,在src/main/resources下创建一个META-INF/plexus/components.xml文件。在这个components.xml中添加如Example 17.11, “覆盖默认生命周期”的内容。在role-hint下设置打包类型的名称,在pheases中设置包含所有需要绑定目标的坐标(省略version)。多个目标可以用逗号分隔,绑定到同一个阶段。

Example 17.11. 覆盖默认生命周期

<component-set>
  <components>
    <component>
      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
      <role-hint>zip</role-hint>
      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
      <configuration>
        <phases>
          <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
          <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
          <package>org.sonatype.mavenbook.plugins:maven-zip-plugin:zip</package>
        </phases>
      </configuration>
    </component>
  </components>
</component-set>


如果你创建了一个插件,它定义了新的打包类型和定制的生命周期,Maven在将你的插件添加到项目POM中并设置extensions元素为true之前,对你插件的定义一概不知。只有在那之后,Maven才会扫描你的插件,而不仅仅只是运行Mojo,它会查找META-INF/plexus下的components.xml文件,然后它会在你的项目中使新的打包类型可用。

Example 17.12. 作为一个Extension配置一个插件

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <groupId>com.training.plugins</groupId>
        <artifactId>maven-zip-plugin</artifactId>
        <extensions>true</extensions>
      </plugin>
    </plugins>
  </build>
</project>


一旦你添加了插件,并将extensions元素设置成true,你就可以使用这个定制的打包类型,你的项目就能运行关联到该打包类型的定制生命周期。