Maven插件包含了一个告诉Maven各种Mojo和插件配置的路线图。这就是插件描述符,它位于JAR文件中的META-INF/maven/plugin.xml
。当Maven载入一个插件的时候,它读取该XML文件,初始化并配置插件对象,使Mojo被包含在插件中,供Maven使用。
当你编写自定义Maven插件的时候,你几乎不需要编写插件描述符。在Chapter 10, 构建生命周期中,绑定到maven-plugin
打包类型的生命周期目标显示,plugin:descriptor
目标被绑定到了generate-resources
生命周期阶段。该目标根据插件源码中的注解生成一个插件描述符。本章后面,你会看到如何注解Mojo,并且你会了解这些注解最终如何成为META-INF/maven/plugin.xml
文件的内容。
Example 17.1, “插件描述符”展示了Maven Zip插件的描述符。该插件简单的对输出目录进行zip压缩并归档。一般来说,你不需要编写自定义插件从Maven创建归档,你可以使用Maven Assembly插件,该插件能够以多种格式帮助生成分发归档。仔细阅读下面的插件描述符以了解其包含的内容:
Example 17.1. 插件描述符
<plugin> <description></description> <groupId>com.training.plugins</groupId> <artifactId>maven-zip-plugin</artifactId> <version>1-SNAPSHOT</version> <goalPrefix>zip</goalPrefix> <isolatedRealm>false</isolatedRealm> <inheritedByDefault>true</inheritedByDefault> <mojos> <mojo> <goal>zip</goal> <description>Zips up the output directory.</description> <requiresDirectInvocation>false</requiresDirectInvocation> <requiresProject>true</requiresProject> <requiresReports>false</requiresReports> <aggregator>false</aggregator> <requiresOnline>false</requiresOnline> <inheritedByDefault>true</inheritedByDefault> <phase>package</phase> <implementation>com.training.plugins.ZipMojo</implementation> <language>java</language> <instantiationStrategy>per-lookup</instantiationStrategy> <executionStrategy>once-per-session</executionStrategy> <parameters> <parameter> <name>baseDirectory</name> <type>java.io.File</type> <required>false</required> <editable>true</editable> <description>Base directory of the project.</description> </parameter> <parameter> <name>buildDirectory</name> <type>java.io.File</type> <required>false</required> <editable>true</editable> <description>Directory containing the build files.</description> </parameter> </parameters> <configuration> <buildDirectory implementation="java.io.File">/data/hudson-temporal-data/hudson-orchestrator-home/workspace/Book-To-Production/content-zh/target</buildDirectory> <baseDirectory implementation="java.io.File">/data/hudson-temporal-data/hudson-orchestrator-home/workspace/Book-To-Production/content-zh</baseDirectory> </configuration> <requirements> <requirement> <role>org.codehaus.plexus.archiver.Archiver</role> <role-hint>zip</role-hint> <field-name>zipArchiver</field-name> </requirement> </requirements> </mojo> </mojos> <dependencies> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependencies> </plugin>
该插件描述符有三个部分:插件的顶层配置,包含如groupId
和artifactId
之类的元素;mojo声明;以及依赖声明。让我们仔细解释一下每一部分。
plugin
元素中顶层的配置元素有:
- description
-
该元素包含了插件的简短描述。在Zip插件的情况中,该描述为空。
- groupId, artifactId, version
-
就像Maven中的任何其它构件一样,插件也需要唯一的坐标。groupId, artifactId,和version用来在Maven仓库中定位插件。
- goalPrefix
-
该元素(目标前缀)用来设置某个特定插件用来引用目标的前缀。如果你看一下Compiler插件的描述符,你会看到
goalPrefix
的值为compile
,如果你看一下Jar插件的描述符,你会看到goalPrefix
为jar
。为自定义插件选择一个独一无二的前缀非常重要。 - isolatedRealm (不赞成使用)
-
该遗留属性不再被Maven使用。它的存在是为了给旧的插件提供向后兼容性。早期版本的Maven使用它提供一种在单独
ClassLoader
中载入插件依赖的机制。Maven扩展使用了Codehaus社区中一个名为ClassWorlds的项目,创建由ClassRealm
对象建模的ClassLoader
对象层次结构。尽管忽略该属性,永远将其设置成false
。 - inheritedByDefault
-
如果inheritedByDefault(缺省继承)被设置成true,所有在父项目配置的该插件的mojo会在子项目中生效。如果你配置一个mojo在父项目中特定的阶段执行,并且该插件inheritedByDefault属性的值为true,这段执行会被子项目继承。如果inheritedByDefault没有被设置成true,那么定义在父项目中的目标执行不会被子项目继承。