倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

GMaven プラグインを作ろう! (4) : GMaven プラグイン・プロジェクトを生成する Groovy スクリプト

GMaven プラグイン・プロジェクトの pom.xml は結構複雑なので(以前の記事)毎回書くのは大変です。 そこで Groovy の練習を兼ねて、テンプレートを生成するスクリプトを書いてみました(GMavenPluginArchetype.groovy*1一覧)。

スクリプトの実行


上記の Groovy スクリプトでプロジェクトを生成するには、プロジェクトを生成したいフォルダ上にその Groovy スクリプトを配置し、以下のコマンド

groovy GMavenPluginArchetype

を実行してください。

入力するパラメータ


上記の Groovy スクリプトを実行すると、「mvn archetype:generate」と同様に、いくつかのパラメータの入力を求められます。 入力するパラメータは以下の通り:

パラメータ デフォルト値 下記でのサンプルでの値
groupId - org.sample
artifactId - maven-hello-plugin
version 1.0-SNAPSHOT 1.0-SNAPSHOT
package ${groupId} org.sample
goal sayhi sayhi
encoding ${file.encoding} UTF-8

生成されるファイル


GMavenPluginArchetype.groovy を実行して生成されるファイルは以下の5つです:

pom.xml
src/main/groovy/HelloMojo.groovy
src/test/groovy/HelloTest.groovy
src/test/project/pom.xml
src/test/project/mvn.groovy

フォルダ構造は下図のようになります:

以下でそれぞれを見ていきましょう。 ただし、各パラメータの値は上記の表の「下記サンプルでの値」が設定されているものとします*2

★pom.xml

これはプラグイン開発するプロジェクトの pom.xml です。 前々回の記事参照。

<?xml version="1.0" encoding="UTF-8"?>
<project
        xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>org.sample</groupId>
    <artifactId>maven-hello-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>maven-plugin</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.codehaus.gmaven</groupId>
            <artifactId>gmaven-mojo</artifactId>
            <version>1.2</version>

            <exclusions>
                <exclusion>
                    <groupId>org.codehaus.gmaven.runtime</groupId>
                    <artifactId>gmaven-runtime-1.5</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.codehaus.gmaven.runtime</groupId>
            <artifactId>gmaven-runtime-1.6</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <defaultGoal>install</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.codehaus.gmaven</groupId>
                <artifactId>gmaven-plugin</artifactId>
                <version>1.2</version>

                <executions>
                    <execution>
                        <goals>
                            <goal>generateStubs</goal>
                            <goal>compile</goal>
                            <goal>generateTestStubs</goal>
                            <goal>testCompile</goal>
                        </goals>

                        <configuration>
                            <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
                            <providerSelection>1.6</providerSelection>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

★src/main/groovy/HelloMojo.groovy

これは実際にプラグインの処理を実装するクラスです。 前回の記事参照。

// Generated from archetype; please customize.
package org.sample

import org.codehaus.gmaven.mojo.GroovyMojo

/**
 * Example Maven2 Groovy Mojo.
 *
 * @goal sayhi
 */
class HelloMojo extends GroovyMojo {
    /**
     * The hello message to display.
     *
     * @parameter expression="${message}" default-value="Hello World"
     */
    String message

    void execute() {
        log.info("${message}")
        show()
    }

    void show(){
        log.info(GroovySystem.properties.'package'.toString())
    }
}

★src/test/groovy/HelloTest.groovy

テストコード。

// Generated from archetype; please customize.
package org.sample

import groovy.util.GroovyTestCase

class HelloTest extends GroovyTestCase {
    void testShow() {
        new HelloMojo().show()
    }
}

★src/test/project/pom.xml

Maven2 に関わらず、プラグインというのはテストが大変。 ということで、プラグインを実際にコンパイル&インストール(ローカルリポジトリへ)した後に別プロジェクトで動作させるテストを作っておくと便利かと。

ってことで、「src/test/project」フォルダ下にそれ用の pom.xml を生成します。 このプロジェクトは validate フェーズを実行すると @sayhi ゴール(プロジェクトを生成時に指定したゴール)が実行されるように設定されています。

少々注意が必要なのは、このプラグイン・テストはプロジェクトをローカルリポジトリへインストールした後に実行する必要があることです。 Maven2 でのテストはインストール前に行うので、このプラグインテストはライフサイクルへは組み込まれてません。

<?xml version="1.0" encoding="UTF-8"?>
<project
        xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>test.org.sample</groupId>
    <artifactId>test-maven-hello-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <defaultGoal>validate</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.sample</groupId>
                <artifactId>maven-hello-plugin</artifactId>
                <version>1.0-SNAPSHOT</version>

                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>sayhi</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

★src/test/project/mvn.groovy

この Groovy プロジェクトは、上記のテストプロジェクトを実行するためのスクリプトです。 実行するためには、環境変数 M2_HOMEMaven2 をインストールしたフォルダへのパスを設定する必要があります。

ただし、テストプロジェクトを実行するためにこの Groovy スクリプトを通す必要はありません。 IDE などで直接テストプロジェクトのフェーズやゴールを実行しても構いません。

ant = new AntBuilder()
ant.property(environment:'env')

if(System.properties['os.name'].contains('Windows'))
  ant.property(name:'mvn', location:'${env.M2_HOME}/bin/mvn.bat')
else
  ant.property(name:'mvn', location:'${env.M2_HOME}/bin/mvn')

ant.exec(dir:'.', executable:'${mvn}', failonerror:true)

今回説明した Groovy スクリプトを実行するためには、このスクリプトをダウンロードしてあれこれしないといけないので、少々面倒かも知れませんが、「プラグインを実行するテストプロジェクト」は結構便利だと思うので、ここでの Groovy スクリプトとは関係なく使ってみてはいかがでしょう?

*1:独自の archetype を書いても使えるようにする設定は大変だし(リポジトリの設定か setting.xml の設定が必要そう)、そもそも Groovy ファイルを配置すべき「src/main/groovy」が何故かしら作成できません。

*2:つまり、サンプル中に現れている ${...} は実際にその様に出力されているということです。