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_HOME に Maven2 をインストールしたフォルダへのパスを設定する必要があります。
ただし、テストプロジェクトを実行するためにこの 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 スクリプトとは関係なく使ってみてはいかがでしょう?