Maven3で最低限動くプラグインを作ってみる

Maven3で最低限動くプラグインを作って実行してみます。
下記の手順でやっていきます。

  1. mvn archetype:generate -Bでプロジェクトを作る
  2. mvn installする
  3. 実装する
  4. mvn <groupId>:<artifactId>:(<version>:)goalで実行してみる

mvn archetype:generate -B ~でプロジェクトを作る

まずプラグイン用のMavenプロジェクトを作ります。
Maven 3.5のビルドライフサイクルを学ぶ - Qiitaの記事を参考にgenerateしてみる。

> mvn archetype:generate -B -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-plugin -DgroupId=org.sample -DartifactId=hello-maven-plugin -Dversion=1.0-SNAPSHOT

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.179 s
[INFO] Finished at: 2019-05-14T10:24:37+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (C:\Users\A\mvn-plugin\hello). Please verify you invoked Maven from the correct directory. -> [Help 1]
[ERROR]
... 省略 ...

Generateしたいのにpomがないって…?
Error "The goal you specified requires a project to execute but there is no POM in this directory" after executing maven command - Stack Overflow
パラメータをダブルクォートで囲んでもう一回実行してみる。

> mvn archetype:generate -B "-DarchetypeGroupId=org.apache.maven.archetypes" "-DarchetypeArtifactId=maven-archetype-plugin" "-DgroupId=org.sample" "-DartifactId=hello-maven-plugin" "-Dversion=1.0-SNAPSHOT"
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] Archetype [org.apache.maven.archetypes:maven-archetype-plugin:1.4] found in catalog remote
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-plugin:1.4
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: org.sample
[INFO] Parameter: artifactId, Value: hello-maven-plugin
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: org.sample
[INFO] Parameter: packageInPathFormat, Value: org/sample
[INFO] Parameter: package, Value: org.sample
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: groupId, Value: org.sample
[INFO] Parameter: artifactId, Value: hello-maven-plugin
[INFO] Project created from Archetype in dir: C:\Users\****\hello-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.104 s
[INFO] Finished at: 2019-05-14T10:40:27+09:00
[INFO] ------------------------------------------------------------------------
[0m[0m

出来た!
確認してみます。

>tree
C:.
└─hello-maven-plugin
    └─src
        ├─it
        │  └─simple-it
        ├─main
        │  └─java
        │      └─org
        │          └─sample
        └─test
            ├─java
            │  └─org
            │      └─sample
            └─resources
                └─project-to-test

出来てるっぽいです。

mvn installする

> cd hello-maven-plugin
>mvn install
... 省略 ...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:32 min
[INFO] Finished at: 2019-05-14T10:57:52+09:00
[INFO] ------------------------------------------------------------------------

上手くいきました。

実装する

Maven – Guide to Developing Java Pluginsのサンプルを作ってみます。
src\main\java\org\smaple\GreetingMojo.javaを作り、A Simple Mojoをコピペします。
(MyMojo.javaはとりあえず置いときます。)

mvn <groupId>:<artifactId>:(<version>:)goalで実行してみる

作成したプラグインを実行してみます。
mvn <groupId>:<artifactId>:(<version>:)goal形式です。
goal名はGreetingMojo.java@Mojo(name=****)の*****部分です。

> mvn org.sample:hello-maven-plugin:sayhi
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.sample:hello-maven-plugin >--------------------
[INFO] Building hello-maven-plugin Maven Plugin 1.0-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- hello-maven-plugin:1.0-SNAPSHOT:sayhi (default-cli) @ hello-maven-plugin ---
[INFO] Hello,world.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.642 s
[INFO] Finished at: 2019-05-14T11:58:25+09:00
[INFO] ------------------------------------------------------------------------

Hello,wold出来ました。

短い形式で実行する設定

Shortening the Command Lineをしたかったんですが${user.home}/.m2/settings.xmlがなかったので作ります。
Maven – Settings ReferenceのQuick Overviewのxmlをコピペして${user.home}/.m2/settings.xmlに保存。
<pluginGroups/>を消して↓に書き換えます。中身はpom.xmlのgroupIdの記述です。

<pluginGroups>
    <pluginGroup>org.sample</pluginGroup>
</pluginGroups>

短い形式で実行してみます。

> mvn hello:sayhi
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.sample:hello-maven-plugin >--------------------
[INFO] Building hello-maven-plugin Maven Plugin 1.0-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- hello-maven-plugin:1.0-SNAPSHOT:sayhi (default-cli) @ hello-maven-plugin ---
[INFO] Hello,world.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.286 s
[INFO] Finished at: 2019-05-14T12:27:56+09:00
[INFO] ------------------------------------------------------------------------

[INFO] Hello,world.出来てますね!

参考