2008.02.25 株式会社四次元データ 森
8. Maven2 プラグインの作成
- 8.1. プラグインの概要
- 8.2. プラグインの作成準備
- 8.3. プラグインの作成
- 8.4. プラグインのテスト
- 8.5. プラグインの配備及び実行
8.2. プラグインの作成準備
今回サンプルとして作成するのは、「指定したディレクトリ配下の、指定した拡張子のファイルの行数をカウントする」プラグインです。
8.2.1 プラグインの命名
Maven からプラグインを呼び出す際には、プラグインの名称が重要となります。作成したプラグインは
$ mvn groupID:artifactID:version:goal
という形式で呼び出せますが、artifactId が maven-$name-plugin となっていると
$ mvn groupID:$name:version:goal
といった形に省略できます。さらにプラグインの pom.xml の build 要素以下に groupId などの指定を行うか
: <build> <plugins> <plugin> <groupId>com.example.maven.plugins</groupId> <artifactId>maven-$name-plugin</artifactId> <version>1.0-SNAPSHOT</version> </plugin> : </plugins> </build> :
<pluginGroups> <pluginGroup>com.example.maven.plugins</pluginGroup> </pluginGroups>
上記のように指定すれば
$ mvn $name:$goal
という呼び出しまでできるようになります。ここまですればほぼ通常の mvn コマンドと変わらない形で実行が可能です。Maven - Guide to Developing Java Plugins の "Executing Your First Mojo" の項で詳細が確認できます。
上記を踏まえて、maven-countlines-plugin を作成し、
$ mvn countlines:countlines
のように実行できるようにしたいと思います。
8.2.2 Maven プラグインプロジェクトの作成
Maven プラグインを作成する際には以下の二点が必要です。
- packaging 要素を「maven-plugin」とする
- maven-plugin-api に対して依存関係を付与する
前者を指定することで実際のプラグインの配備時に Maven plugin として必要なパッケージングを行い、プラグインの設定ファイルである plugin.xml などが自動生成するようになります。後者には前節で述べた Mojo インターフェースなどが含まれます。 Maven Plugin API のバージョンは最新版を用いることにしましょう。2008年2月現在、2.0.8 が最新版になります。
Maven 2.0.8 からは引数を覚える必要がなくなり、
$ mvn archetype:create
とし、順番にarchetype, groupId, artifactId, version, package を聞かれますので、それに沿って指定していけばよくなりました。なお、Maven 2.0.7 まで用いられた、引数での指定は使えなくなっているようです。
- Choose a numeber : mave-archetype-mojo (A Maven plugin development project) と記述してある数字を指定します。
- Define value for groupId : com.example.maven.plugins
- Define value for artifactId : maven-countlines-plugin
- Define value for version : 1.0-SNAPSHOT
- Define value for package : com.example.maven.plugins
上記のような指定を行い最後に Y : と聞かれますのでエンターキーをタイプし実行すればプラグインプロジェクトがビルドされます。訂正する場合は Y : n とするともう一度 groupId から指定しなおします。
この操作により生成される pom.xml には以下の記述が含まれていることを確認してください。
: <groupId>com.example.maven.plugins</groupId> <artifactId>maven-countlines-plugin</artifactId> <packaging>maven-plugin</packaging> <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>2.0.8</version> </dependency> :
8.2.3 Eclipese への読み込み
先ほど作成した Maven プラグインプロジェクトを Eclipse へ読み込ませます。まず Java Project の新規作成を選び、プロジェクト名を maven-countlines-plugin とします。MyMojo.java という java クラスが生成しているのが確認できますが、これは今回用いないのでいったん削除します。
この際に m2eclipse が有効になっていることを確認してください。プロジェクト上で右クリックすると Maven2 というコンテキストメニューがありますので enable になっていることを確認します。
8.2.4 Mojo インターフェース実装クラス
プラグインそのものとなる Mojo インターフェースの実装クラスの作成に入ります。最初から AbstractMojo という抽象クラスが用意されているのでそれを拡張していく手法をとります。ここでは CountlinesMojo としました。
生成した Mojo クラスに対してゴール名を設定する必要がありますが、ここで Maven プラグインの作成方法の大きな特徴があります。Mavenプラグインでは、ゴール名やそのゴールが依存するフェーズなどを、直接クラスファイルに javadoc として記述します。特に今後設定用の XML ファイルなどを作成する必要はありません。
クラスに対して設定出来る javadoc については以下があります。
@goal | ゴール名 |
@phase | このプラグインが紐付けられるフェーズ名 |
@execute | このゴールの実行時に並行して実行されるフェーズ名、ゴール名、ライフサイクル名 |
@requiresDependencyResolution | このプラグインの実行に必要な依存関係のスコープ、現時点では compile/runtime/test が指定可能 |
今回ゴール名として、countlines を指定します。特に依存関係を扱うプラグインを利用する際にはこの @requiresDependencyResolution に注意してください。またこれらの javadoc のエントリの内部には日本語を使わないで下さい。というのも、 Maven - Maven 2.0 - Mojo API Specification の "The Descriptor and Annotations" にもあるように、javadoc のコメントはそのプラグインの Description に利用されます。それは先述の plugin.xml 内にそのまま含まれてしまい、文字列が文字化けしたままとなってしまいます。UTF-8 で作成してもこれについては対処がなされていませんでした。
これらを踏まえると CountlinesMojo クラスの書き出しは以下のようになります。
/** * Count lines of selected files * @goal countlines */ public class CountlinesMojo extends AbstractMojo { :