插件前缀解析简介

当您使用标准生命周期阶段执行 Maven 时,解析参与该生命周期的插件是一个相对简单的过程。但是,当您直接从命令行调用 mojo 时,例如clean,Maven 必须有某种方法可以可靠地将clean插件前缀解析为maven-clean-plugin。这为命令行调用提供了简洁性,同时保留了插件真实 artifactId 的描述性。

更复杂的是,并非所有插件都应强制在存储库中具有相同的 groupId。由于 groupId 被假定为由一个项目控制,并且多个项目可能会为 Maven 发布插件,因此插件前缀映射也必须适应多个插件 groupId。

为了解决这些问题,Maven 为插件组提供了一个新的存储库级元数据(不与任何单个工件相关联),以及一个插件映射管理器来组织多个插件组并提供搜索功能。

指定插件的前缀

为了给用户一个方便的前缀来引用您的插件,必须在构建插件时将前缀与您的插件相关联。默认情况下,Maven 将通过删除插件工件 ID 中由连字符包围的任何“maven”或“plugin”实例来猜测要使用的插件前缀。要使用的常规工件 ID 格式是:

  • maven-${prefix}-plugin- 对于由 Apache Maven 团队自己维护的官方插件(您不得为您的插件使用此命名模式,请参阅此说明以获取更多信息
  • ${prefix}-maven-plugin- 对于其他来源的插件

如果您的插件的 artifactId 符合此模式,Maven 将自动将您的插件映射到存储在存储库上插件的 groupId 路径中的元数据中的正确前缀。但是,如果要自定义用于引用插件的前缀,可以直接通过maven-plugin-plugin插件 POM 中的配置参数指定前缀:

<project>
  ...
  <build>
    ...
    <plugins>
      ...
      <plugin>
        <artifactId>maven-plugin-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          ...
          <goalPrefix>somePrefix</goalPrefix>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

上述配置将允许用户通过前缀somePrefix引用您的插件,如下例所示:

mvn somePrefix:goal

将前缀映射到插件

对于为搜索配置的每个 groupId,Maven 将:

  1. 从每个远程仓库下载maven-metadata.xml到本地仓库,并maven-metadata-${repoId}.xml在 ${groupId} 的路径中命名。
  2. 将这些元数据文件连同maven-metadata-local.xml(如果存在)一起加载到 ${groupId} 的路径中。合并它们。
  3. 在合并的元数据中查找插件前缀。如果它被映射,它应该引用一个具体的 groupId-artifactId 对。否则,继续 #1 以获取用户插件组中的下一个 groupId。

这些元数据文件包含它所代表的groupId(为了清楚起见,当文件在目录上下文之外打开时)和一组插件元素。此列表中的每个插件都包含一个表示插件命令行前缀的前缀元素和一个artifactId元素,该元素提供前缀映射的另一端并提供足够的信息来查找和使用插件。安装或部署插件时,会找到适当的元数据文件(如果缺少前缀映射),则将其修改为包含插件前缀映射。

配置 Maven 以搜索插件

默认情况下,Maven 将在 groupId org.apache.maven.plugins中搜索prefix-to-artifactId 映射,以获得执行给定构建所需的插件。但是,如前所述,用户可能需要第三方插件。由于假定 Maven 项目可以控制默认插件 groupId,这意味着配置 Maven 以搜索其他 groupId 位置以查找插件前缀映射。

事实证明,这很简单。在 Maven 设置文件(每个用户:${user.home}/.m2/settings.xml;全局:)${maven.home}/conf/settings.xml中,您可以提供自定义pluginGroups部分,列出您要搜索的插件 groupId(每个 groupId 都在其自己的pluginGroup子元素中)。例如,如果我的项目使用 Modello 模型文件,我的设置中可能包含以下内容:

<pluginGroups>
  <pluginGroup>org.codehaus.modello</pluginGroup>
</pluginGroups>

这允许我执行以下操作,这将从模型生成 Java 类:

mvn -Dversion=4.0.0 -Dmodel=maven.mdo modello:java

在搜索用户设置中指定的任何插件组,Maven 将始终搜索以下 groupId :

  • org.apache.maven.plugins
  • org.codehaus.mojo

注意:在指定用于搜索前缀映射的插件组时,顺序很重要!com.myco.plugins通过指定一个前缀为的 pluginGroup clean,我可以覆盖调用maven-clean-pluginwhen的用法。clean:clean

注 2:有关 的更多信息settings.xml,请参阅 [ 1 ]。

资源

1 Maven 配置指南