17.4.3. 配置插件前缀

在命令行声明groupId,artifactId,version和goal十分麻烦。为了处理这个问题,Maven为插件分配了前缀。你可以使用插件前缀jar,然后使用命令mvn jar:jar,而非:

$ mvn org.apache.maven.plugins:maven-jar-plugin:2.2:jar

Maven是如何解析jar:jarorg.apache.mven.plugins:maven-jar:2.3的呢?Maven查看Maven仓库中的一个文件然后获得一些列含有特定groupId的插件。默认情况下,Maven被配置成从两个组寻找插件:org.apache.maven.pluginsorg.codehaus.mojo。当你指定一个新的插件前缀如mvn hibernate3:hbm2ddl的时候,Maven会为了正确的插件前缀扫描仓库元数据。首先,Maven会扫描org.apache.maven.plugins组来查找插件前缀hibernate3。如果它没有在这个组中找到该插件前缀,它就会接着扫描org.codehaus.mojo组的元数据。

当Maven针对某个特定的groupId扫描元数据的时候,它从Maven仓库获取一个XML文件,该文件包含了这个组中构件的元数据。该XML文件对于每个遵循参考实现的仓库来说都是明确的,如果你不在使用一个自定义仓库,你就能在你的本地Maven仓库(~/.m2/repository)路径org/apache/maven/plugins/maven-metadata-central.xml下看到组org.apache.maven.plugins的Maven元数据。Example 17.4, “Maven插件组的Maven元数据”展示了这样一个XML文件的代码片段。

Example 17.4. Maven插件组的Maven元数据

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <plugins>
    <plugin>
      <name>Maven Clean Plugin</name>
      <prefix>clean</prefix>
      <artifactId>maven-clean-plugin</artifactId>
    </plugin>
    <plugin>
      <name>Maven Compiler Plugin</name>
      <prefix>compiler</prefix>
      <artifactId>maven-compiler-plugin</artifactId>
    </plugin>
    <plugin>
      <name>Maven Surefire Plugin</name>
      <prefix>surefire</prefix>
      <artifactId>maven-surefire-plugin</artifactId>
    </plugin>
    ...
  </plugins>
</metadata>

正如你在Example 17.4, “Maven插件组的Maven元数据”中所看到的,你本地仓库的maven-metadata-central.xml文件能帮助你运行mvn surefire:test。Maven扫描org.apache.maven.pluginsorg.codehaus.mojoorg.apache.maven.plugins中的插件被认为是核心Maven插件,而org.codehaus.mojo中的被认为是额外的插件。Apache Maven项目管理org.apache.maven.plugins组,而另外一个独立的开源社区管理Codehaus Mojo项目。如果你想要发布插件到你自己的groupId下,你就需要让Maven自动扫描你的groupId以获得插件前缀,你就可以通过Maven settings自定义Maven需要扫描的插件组。

如果你想要通过first:echo命令就能运行first-maven-plugin的echo目标,如所示,添加org.sonatype.mavenbook.plugins groupId至你的~/.m2/settings.xml文件中。这会让Maven优先扫描org.sonatype.mavenbook.plugins插件组。

Example 17.5. 在Maven Settings中自定义插件组

<settings>
  ...
  <pluginGroups>
    <pluginGroup>org.sonatype.mavenbook.plugins</pluginGroupd>
  </pluginGroups>
</settings>

你可以在任何目录运行mvn first:echo,并看到Maven正确解析了目标前缀。这样子行得通是因为我们遵循了Maven插件的命名约定。如果你的插件有一个artifactId,并且它遵循模式maven-first-plugin,或者first-maven-plugin。Maven就会自动为你的插件赋予前缀first。换句话说,当Maven Plugin插件为你的插件生成插件描述符的时候,你不需要显式的为你的项目设定goalPrefix当你的artifactId符合如下模式的时候,plugin:descriptor目标会从你插件的artifactId中抽取前缀。

  • ${prefix}-maven-plugin, OR

  • maven-${prefix}-plugin

如果你想要显式的设定插件前缀,你需要配置Maven Plugin插件。Maven Plugin插件被用来构建插件描述符,并在打包和加载阶段运行一些插件特定的任务。Maven Plugin插件可以像其它任何插件一样在build元素下配置。要为你的插件设置插件前缀,在项目first-maven-plugin的pom.xml中添加如下的build元素:

Example 17.6. Configuring a Plugin Prefix

<?xml version="1.0" encoding="UTF-8"?><project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sonatype.mavenbook.plugins</groupId>
  <artifactId>first-maven-plugin</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>maven-plugin</packaging>
  <name>first-maven-plugin Maven Mojo</name>
  <url>http://maven.apache.org</url>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-plugin-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <goalPrefix>blah</goalPrefix>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>2.0</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Example 17.6, “Configuring a Plugin Prefix”设置了插件前缀为blah。如果在~/.m2/settings.xml中的pluginGroups下添加了org.sonatype.mavenbook.plugins元素,你就应该能够在任何目录通过mvn blah:echo命令运行EchoMojo