在命令行声明groupId,artifactId,version和goal十分麻烦。为了处理这个问题,Maven为插件分配了前缀。你可以使用插件前缀jar,然后使用命令mvn jar:jar,而非:
$ mvn org.apache.maven.plugins:maven-jar-plugin:2.2:jar
Maven是如何解析jar:jar至org.apache.mven.plugins:maven-jar:2.3的呢?Maven查看Maven仓库中的一个文件然后获得一些列含有特定groupId的插件。默认情况下,Maven被配置成从两个组寻找插件:org.apache.maven.plugins和org.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.plugins和org.codehaus.mojo:org.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。

