本章,我们将介绍一个用Java编写的Maven
Mojo。你项目中每一个Mojo都要实现org.apache.maven.plugin.Mojo
接口,下例中的Mojo
通过扩展org.apache.maven.plugin.AbstractMojo
类实现了该接口。在我们深入Mojo的代码之前,让我们花一些时间看一下Mojo接口。Mojo提供过了如下的方法:
void setLog( org.apache.maven.monitor.logging.Log log )
-
每一个Mojo实现都必须提供一种方法让插件能够和某个特定目标的过程相交流。该目标成功了么?或者,是否在运行目标的时候遇到了问题?当Maven加载并运行Mojo的时候,它会调用
setLog()
方法,为Mojo实例提供正确的日志目标,以让你在自定义插件中使用。 protected Log getLog()
-
Maven会在Mojo运行之前调用
setLog()
方法,然后你的Mojo就可以通过调用getLog()
获得日志对象。你的Mojo应该去调用这个Log
对象的方法,而不是直接将输出打印到标准输出或者控制台。 void execute() throws org.apache.maven.plugin.MojoExecutionException
-
轮到运行你目标的时候,Maven就会调用该方法。
Mojo接口只关心两件事情:目标运行结果的日志记录,以及运行一个目标。当你编写自定义插件的时候,你会要扩展AbstractMojo
。AbstractMojo
处理setLog()
和getLog()
的实现,并包含一个抽象的execute()
方法。在你扩展AbstractMojo
的时候,你所需要做的只是实现execute()
方法。Example 17.3, “一个简单的EchoMojo”展示了一个简单的Mojo实现,它只是打印一条简单的信息到控制台。
Example 17.3. 一个简单的EchoMojo
package org.sonatype.mavenbook.plugins; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; /** * Echos an object string to the output screen. * @goal echo */ public class EchoMojo extends AbstractMojo { /** * Any Object to print out. * @parameter expression="${echo.message}" default-value="Hello Maven World..." */ private Object message; public void execute() throws MojoExecutionException, MojoFailureException { getLog().info( message.toString() ); } }
如果你在前一节中创建的项目的/data/hudson-temporal-data/hudson-orchestrator-home/workspace/Book-To-Production/content-zh
下,按照路径src/main/java/
创建该Mojo,然后运行mvn
install,你就可以在命令行直接调用该目标。
org/sonatype/mavenbook/mojo/EchoMojo.java
$ mvn org.sonatype.mavenbook.plugins:first-maven-plugin:1.0-SNAPSHOT:echo
这一长串命令行是mvn后面加上groupId:artifactId:version:goal
。在你运行该命令之后你应该会看到一个包含了目标echo信息的输出:“Hello
Maven World”。如果你想要自定义该信息,你可以如下在命令行传入信息参数:
$ mvn org.sonatype.mavenbook.plugins:first-maven-plugin:1.0-SNAPSHOT:echo \
-Decho.message="The Eagle has Landed"
仍然按照前一条命令运行EchoMojo
,会得到这样的输出:“The Eagle has
Landed”。