17.4.5. Mojo类注解

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的新特性。