インタラクティブな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"));