倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

プラグインを作ろう! (6) -- @phase:他のフェーズに処理を割り込ませる

前回は自作の mojo にゴール名を設定する仕方を見ました。 これによって、コマンド・プロンプトから自作のプラグインを実行できるようになりました。

しかし実際には、何らかのフェーズ(例えばコンパイルやインストールなど)が実行されたとき、それをトリガーとして自作のプラグインを実行したいということがよくあるかと思います。 これを行うには、前回よりももう少し設定が必要になります。

@phase アノテーション


自作の Mojo に「@phase アノテーション」を付加することで、何らかのフェーズ(の後)に処理を割り込ませることができます。 @phase の使い方は @goal と殆ど同じです。 ただし、@phase に続けるのは処理を割り込ませたいフェーズの名前です。

例として、前回の HelloMojo の処理を install フェーズ(の後)に割り込ませるように設定しましょう:

package org.sample;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;

/**
 * My first plugin !
 *
 * @goal sayhi
 * @phase install
 */
public class HelloMojo extends AbstractMojo{
    
    public void execute()throws MojoExecutionException{
        getLog().info("***** Hello, world ! *****");
    }
}

JavaDoc コメント「@phase install」を付け加えただけです。

プラグインを使用するプロジェクトでの設定


プラグインを使用するプロジェクト側では、/project/build/plugins 要素下に自作のプラグイン・プロジェクトの設定(groupId, artifactId など)を書き、 さらにその直下に executions/execution/goals/goal 要素を付加します。 <goal> 要素の子テキストは実行したいゴールの名前にします:

<?xml version="1.0"?>
<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.sample</groupId>
        <artifactId>hello</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>sayhi</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

実行方法


上記のように設定すると、通常のビルドを実行するだけで、自作のプラグイン・プロジェクトを実行することが出来ます:

mvn install

ちなみに、前回と同じように次のコマンド

mvn org.sample:hello:sayhi

を実行すると、このゴールの処理だけが実行されます*1

@phase アノテーションを使わずに処理を割り込ませる


一応、Mojo に @phase 付加しなくても、プラグインを使用するプロジェクト側の設定だけによって上記と同じことができるので、ご紹〜介。 そのためには、<plugin> 要素下に <phase> 要素を付加して、その子テキストに処理を割り込ませたいフェーズ名を指定します:

<?xml version="1.0"?>
<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.sample</groupId>
        <artifactId>hello</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>sayhi</goal>
            </goals>
            <phase>install</phase>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

実行の仕方は @phase を使用したときと同じです。

実用SSH 第2版―セキュアシェル徹底活用ガイド

実用SSH 第2版―セキュアシェル徹底活用ガイド

*1:「mvn」コマンドの引数として、「ゴール名」を指定するとそのゴールのみが実行されます。 一方、「フェーズ名」を指定すると、そのフェーズを含むライフサイクル(のうち、指定したフェーズまで)が実行されます。 詳しくはこちらを参照。