在first-maven-plugin
中,我们并没有编写插件描述符,我们依赖于Maven从源码生成插件描述符。该描述符根据你插件项目的POM信息以及EchoMojo
类上一系列的注解生成。EchoMojo
仅仅声明了一个@goal
注解,这里有一个注解的列表,你可以将其用到Mojo实现上。
- @goal <goalName>
-
这是唯一必需的注解,它给予目标一个在插件中唯一的名称。
- @requiresDependencyResolution <requireScope>
-
标记该mojo在可以运行之前,需要特定范围(或者一个暗指的范围)的依赖。支持的范围有compile,runtime,和test。如果该注解有一个值为test,那么就是告诉Maven,除非测试范围的所有依赖都被正确解析了,否则该mojo不能运行。
- @requiresProject (true|false)
-
标记该mojo必须在一个项目中运行,默认为true。这一点插件类型和骨架类型(archetype)相反,后者默认为false。
- @requiresReports (true|false)
-
如果你正创建一个依赖于报告的项目,你就需要将
requiresReports
设置成true。该注解默认的值是false。 - @aggregator (true|false)
-
一个
aggregator
设置成true的Mojo在Maven运行的时候只会被执行一次,有了该选项,插件开发者就可以汇总一系列构建的输出;例如,创建一个插件用来汇总一次构建包含的所有项目的报告。aggregator
设置成true的目标只针对Maven构建的顶层项目运行。该注解默认的值是false。 - @requiresOnline (true|false)
-
当该注解的值是true的时候,Maven在脱机模式运行的时候该目标运行就会失败。Maven会抛出一个错误。默认值:false。
- @requiresDirectInvocation
-
当设置成true的时候,只有当用户显式的从命令行触发的时候,该插件才能得以执行。如果有人试图将其绑定到一个生命周期阶段,Maven就会抛出一个错误。默认值是false。
- @phase <phaseName>
-
该注解指定目标默认的生命周期阶段。如果你将该目标的执行配置到了pom.xml而且没有指定一个阶段。Maven就会使用该注解的值将其绑定到一个默认的阶段。
- @execute [goal=goalName|phase=phaseName [lifecycle=lifecycleId]]
-
该注解有很多种使用方式。如果提供了一个阶段,Maven就会执行一个平行的生命周期(直到指定的阶段)。这个单独执行的结果可以通过Maven属性
${executedProperty}
供插件使用。第二种使用该注解的方式是使用
prefix:goal
标记指定一个显式的目标。当你仅仅指定一个目标的时候,Maven会在一个平行的环境中执行该目标,不会影响当前的Maven构建。第三种使用该注解的方式是,使用一个生命周期定义文件,并指定这个生命周期的一个阶段。
@execute phase="package" lifecycle="zip" @execute phase="compile" @execute goal="zip:zip"
如果你看一下EchoMojo
的源码,你会注意到Maven并没有使用Java
5的标准注解。而是使用了Commons
Attributes。在注解成为Java语言的一部分之前,Commons
Attributes为Java程序员提供了一种使用注解的方式。为什么Maven不使用Java 5的注解呢?这是因为Maven是针对Java
5之前的JVM设计的。因为Maven必须支持Java比较老的版本,所以它不能使用任何Java
5的新特性。