普段 Maven の山のようにある Plugin の使い方がわからないときに、ググって解決してたのですが、よろしくないなと思ったので usage を出す方法を調べました。
Maven Help Plugin の describe goal を使う
例えば Exec Maven Plugin の usage を見たい場合は以下のようになります。
$ mvn help:describe -Dplugin=exec
Name: Exec Maven Plugin
Description: A plugin to allow execution of system and Java programs
Group Id: org.codehaus.mojo
Artifact Id: exec-maven-plugin
Version: 1.4.0
Goal Prefix: exec
This plugin has 3 goals:
exec:exec
Description: A Plugin for executing external programs.
exec:help
Description: Display help information on exec-maven-plugin.
Call mvn exec:help -Ddetail=true -Dgoal=<goal-name> to display parameter
details.
exec:java
Description: Executes the supplied java class in the current VM with the
enclosing project's dependencies as classpath.
For more information, run 'mvn help:describe [...] -Ddetail'
help も plugin なのが maven エコシステム流なのですね。
なお、出力の末尾にも書いてありますが -Ddetail で詳細情報(Plugin 固有のJava システムプロパティなど)が得られます。
Exec Maven Plugin の全貌ではなく mvn exec:java だけが知りたいんだ!という場合は -Dgoal で goal 名を指定します。
$ mvn help:describe -Dplugin=exec -Dgoal=java
exec:java
Description: Executes the supplied java class in the current VM with the
enclosing project's dependencies as classpath.
For more information, run 'mvn help:describe [...] -Ddetail'
-Dplugin, -Dgoal の代わりに -Dcmd でまとめて書くこともできます。
$ mvn help:describe -Dcmd=exec:java
help goal
ちょっとこれだと覚えるのが大変そう、と思っていましたが、最近の Maven Plugin は help goal を生成するそうなので、こちらを使うとシンプルに書けるのでした。
$ mvn exec:help
もちろん、-Ddetailも、-Dgoal も使えます。
$ mvn exec:help -Dgoal=java
mvn help:describe -Dcmd=exec:java とさして変わらない長さになってしまった気がしますが忘れましょう。
phase 名で実行される plugin を知りたい
これで万全、と思ったのですが、まだ困るケースがありました。
Maven は mvn test や mvn compile のように mvn <plugin>:<goal> の形式ではなく、mvn <phase> の形式でも実行できます。
mvn test とすると mvn surefire:test が動くのですが、この関連はちょっと覚えるのが難しいですね。ググると公式のドキュメントに対応表がありました。これを覚えるか紐解くかしないといけないのは大変だと思ったのですが、mvn コマンドですぱっと調べる良い方法がわかりませんでした。
mvn help:effective-pom を使えば phase と goal の関係がわかるといえばわかるのですが、XML を人間が読むのはちょっとキツいので今後の課題としたいところです。
所感
ちょっと Maven の usage 見たいなと思っただけで、ここまで連れて行かれる JavaWorld の広大さを久々に感じました1。
-
その前はちょっとログファイルでも作るかと思ったときに広大な世界を感じました。 ↩