17.4.2. 一个简单的Java Mojo

本章,我们将介绍一个用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接口只关心两件事情:目标运行结果的日志记录,以及运行一个目标。当你编写自定义插件的时候,你会要扩展AbstractMojoAbstractMojo处理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/org/sonatype/mavenbook/mojo/EchoMojo.java创建该Mojo,然后运行mvn install,你就可以在命令行直接调用该目标。

$ 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”。