インタラクティブなMaven2プラグインの作り方

maven-release-pluginやmaven-archetype-pluginでは、プラグインの実行時にユーザにキーボードから入力を求めてくるようなインタラクティブなモードがあります。

Javaだと、System.inを使ってこういう対話的なアプリケーションを作ることはできますが、実はMaven2プラグインでは汎用的なPrompterというコンポーネントを利用することで、簡単に作ることができます。このPrompterは、Maven2が基盤として利用しているPlexusというDIコンテナが提供しています。

maven-trac-pluginでも同様に、Tracで現在オープン状態にあるマイルストーンの一覧を取得して画面に表示し、そこからユーザに選択させるという処理がありますが、このPrompterを利用しています。

以下に、簡単な使い方の例を載せておきます。コード(Mojo)は以下のような感じ。

import org.codehaus.plexus.components.interactivity.Prompter;
import org.codehaus.plexus.components.interactivity.PrompterException;

/**
 * 
 * @goal sample
 */
public class SampleMojo extends AbstractMojo {

	/**
	 * @component
	 */
	private Prompter prompter;

	public void execute() throws MojoExecutionException, MojoFailureException {
		try {
			String input = prompter.prompt("Please Input Something");

		} catch (PrompterException e) {
			…
		}
	}

ポイントは以下の通り。

  • @componentでPrompterコンポーネントをインジェクトする
    • Prompterクラス自体はインタフェースですが、実行時はデフォルト実装のorg.codehaus.plexus.components.interactivity.DefaultPrompterがインジェクトされます。
  • インジェクトしたPrompterのメソッドを呼ぶ。
    • 最も単純なのは上記のように表示するメッセージを渡すだけのpromptメソッドです。この例だと、ユーザが入力した値が戻り値としてそのまま返りinputに代入されます。

すごい簡単ですね! その他、決められた特定の値をユーザが入力しない限り、再入力を促すようなメソッドもあります。以下のようにすると、1、2、3のうちどれかをユーザが入力しない限り、繰り返し入力を求められます。

			String inputNumber = prompter.prompt("Please choose Number.", Arrays.asList("1", "2", "3"));