首页 » Maven实战 » Maven实战全文在线阅读

《Maven实战》17.3 Mojo标注

关灯直达底部

每个Mojo都必须使用@Goal标注来注明其目标名称,否则Maven将无法识别该目标。Mojo的标注不仅限于@Goal,以下是一些可以用来控制Mojo行为的标注。

·@goal<name>

这是唯一必须声明的标注,当用户使用命令行调用插件,或者在POM中配置插件的时候,都需要使用该目标名称。

·@phase<phase>

默认将该目标绑定至Default生命周期的某个阶段,这样在配置使用该插件目标的时候就不需要声明phase。例如,maven-surefire-plugin的test目标就带有@phase test标注。

·@requiresDependencyResolution<scope>

表示在运行该Mojo之前必须解析所有指定范围的依赖。例如,maven-surefire-plugin的test目标带有@requiresDependencyResolution test标注,表示在执行测试之前,所有测试范围的依赖必须得到解析。这里可用的依赖范围有compile、test和runtime,默认值为runtime。

·@requiresProject<true/false>

表示该目标是否必须在一个Maven项目中运行,默认为true。大部分插件目标都需要依赖一个项目才能执行,但有一些例外。例如maven-help-plugin的system目标,它用来显示系统属性和环境变量信息,不需要实际项目,因此使用了@requiresProject false标注。另外,maven-archetype-plugin的generate目标也是一个很好的例子。

·@requiresDirectInvocation<true/false>

当值为true的时候,该目标就只能通过命令行直接调用,如果试图在POM中将其绑定到生命周期阶段,Maven就会报错,默认值为false。如果你希望编写的插件只能在命令行独立运行,就应当使用该标注。

·@requiresOnline<true/false>

表示是否要求Maven必须是在线状态,默认值是false。

·@requiresReport<true/false>

表示是否要求项目报告已经生成,默认值是false。

·@aggregator

当Mojo在多模块项目上运行时,使用该标注表示该目标只会在顶层模块运行。例如maven-javadoc-plugin的aggregator-jar使用了@aggregator标注,它不会为多模块项目的每个模块生成Javadoc,而是在顶层项目生成一个已经聚合的Javadoc文档。

·@execute goal=“<goal>”

在运行该目标之前先让Maven运行另外一个目标,如果是本插件的目标,则直接使用目标名称,否则使用“prefix:goal”的形式,即注明目标前缀。例如,maven-pmd-plugin是一个使用PMD来分析项目源码的工具,它包含pmd和check等目标,其中pmd用来生成报告,而check用来验证报告。由于check是依赖于pmd生成的内容的,因此可以看到它使用了标注@execute goal=“pmd”。

·@execute phase=“<phase>”

在运行该目标之前让Maven先运行一个并行的生命周期,到指定的阶段为止。例如maven-dependency-plugin的analyze使用了标注@execute phase="test-compile",因此当用户在命令行执行dependency:analyze的时候,Maven会首先执行default生命周期所有至test-compile的阶段。

·@execute lifecycle=“<lifecycle>”phase=“<phase>”

在运行该目标之前让Maven先运行一个自定义的生命周期,到指定的阶段为止。例如maven-surefire-report-plugin这个用来生成测试报告的插件,它有一个report目标,标注了@execute phase="test"lifecycle="surefire",表示运行这个自定义的surefire声明周期至test阶段。自定义生命周期的配置文件位于src/main/resources/META-INF/maven/lifecycle.xml。内容如代码清单17-5所示。

代码清单17-5 maven-surefire-report-plugin的自定义生命周期