在命令行声明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
。