お久しぶりです。
さすが師走と言うか、忙しくてなかなかblog書く暇がありません。
今日はm2のPluginのつくり方について調べたことのメモです。
調べているうちにさらに様々な疑問点、問題点が噴出してきてしまって
いるのですが、それはとりあえず置いておいてプラグインの書き方の話しに
集中しましょう。
m2のPluginの作り方は意外と簡単で、以下の3ステップでOKです。
- Plugin用のPOMを作る。
- AbstractPluginクラスをextendしてJavaクラスとしてプラグインを記述する。
- plugin:installゴールを実行
これで、作ったPluginがローカルリポジトリにインストールされて、
使えるようになります。
以下、各ステップをもうちょい詳しく解説します。
1. Plugin用のPOMを作る
まずPlugin自体のPOMを作ります。このPOMはリポジトリにインストールされて、
Pluginが依存するjarを自動的にダウンロードする時などに使われます。
今回作ったPOMは以下のような感じです。
<?xml version="1.0" encoding="Shift_JIS"?>
<project>
<!--
おまじない。Pluginの共通の親POM。
Mavenリポジトリ内のPOMを継承している!
-->
<parent>
<groupId>maven</groupId>
<artifactId>maven-plugin-parent</artifactId>
<version>2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!--groupIdはかならずmaven-->
<groupId>maven</groupId>
<!--artifactIdはmaven-[Plugin名]-plugin-->
<artifactId>maven-foo-plugin</artifactId>
<name>My First Plugin</name>
<type>plugin</type>
<!--いまのところバージョンはこれ以外指定できない-->
<version>1.0-SNAPSHOT</version>
<inceptionYear>2001</inceptionYear>
<package>org.apache.maven</package>
<logo>/images/maven.gif</logo>
</project>
2.AbstractPluginクラスをextendしてJavaクラスとしてプラグインを記述する。
いよいよプラグイン本体の作成です。
今回作ったのはPOMに書かれたプロジェクト名を
出力するというごく簡単な物です。
ソースコードは大体以下の通りです。パッケージ宣言とかインポート文は省いてます。
/**
* @goal print
*
* @description deploys a pom to remote repository
*
* @parameter
* name="projectName"
* type="String"
* required="true"
* validator=""
* expression="#project.name"
* description=""
*
*/
public class SampleMojo extends AbstractPlugin {
public void execute(PluginExecutionRequest request, PluginExecutionResponse response) {
String pn = (String) request.getParameter("projectName");
System.out.println("Project Name:" + pn);
}
}
実装しなくてはならないのはexecuteだけのようです。
なんだかServletみたいなインターフェースですね。
JavaDocの中に定義しているパラメータとrequest.getParameterで取得している
パラメータとの対応関係に注意して下さい。
プラグインが必要とするパラメータは設定情報として切り出されて、
コンテナ側が勝手にrequestオブジェクトにセットしてくれるようになっています。
おかげでm2のpluginはPluginのインターフェースにのみ依存し、
m2のCoreには依存しないように記述することが出来ます。
2.plugin:installゴールを実行
ここまで出来たらプロジェクトのベースディレクトリで
m2 plugin:install
を実行すると、JavaDocの中に書かれていた設定情報から
XML形式の設定ファイルを生成し、クラスをコンパイルし、Jarに固め、
ローカルリポジトリにインストールし、POMもローカルリポジトリにインストールし、
使える状態に持っていってくれます。
このプラグインを実行するには
m2 foo:print
でOKです。
POMのname要素に書かれているプロジェクト名が出力されるはずです。