読者です 読者をやめる 読者になる 読者になる

Groovy-Eclipse compilerプラグインで、Maven上でGroovy!

妹の家に泊まってたら、妹が牡蠣にあたって看病することになったikikkoです。こんばんは。

EclipseでのGroovyエディタ、Groovy-Eclipseのサイトを見ていたらGroovy - Groovy-Eclipse compiler plugin for Mavenを見つけたので、ちょっと試してみました。

なお「Eclipse」とありますが、一部を除いてEclipseに特化しているわけではありません。


背景

自分の主フィールドはJava(+Maven+Eclipse)なんですが、最近はJavaが面倒なところをGroovyで補完できたらなーと考えてます。で、その一環として、テストコードをGroovyで書けないかなと調べてたところでした。プロダクトコード(src/main/~)にGroovyを突っ込むのはちょっと時期尚早な香りがするので、まずはテストコード(src/test/~)などに採用して感触を掴みたいなと。

一部ではこんなことも言われてますが、キニシナイ。。。
f:id:ikikko:20110320005413p:image

MavenでGroovyファイルを実行するには、何通りかやり方があるみたいですね。例えば、

でちょっと調べていたら、冒頭のようにGroovy-Eclipseのサイトで↓のようなのを見つけました。「EclipseのGroovyエディタ内で使われているGroovyコンパイラを、Mavenから呼べるようにしたもの」らしいですね。

特徴

Groovy-Eclipse compilerプラグインで、いくつか挙げられている特徴。まずはメリットから。

  • Javaのスタブファイルを作らないので、スタブ関連の問題が起きない
    • GMavenだとスタブファイルを作って、それに対してビルドをかける
  • Eclipseエディタで使用されているものと同じコンパイラなので、EclipseMavenでのビルドに差異が起きにくい
  • 枯れているmaven-compiler-pluginを使用している
    • 設定 > ビルド定義で後述してます

続いて、欠点。

  • 現状、Groovy 1.7.5のみのサポート
  • スタブが作られないので、Groovydoc(Javadoc)も作られない
  • Groovy Mojoがサポートされない
    • 具体的にどういうデメリットになるかはちょっと分かってません。すいません。。。

あと注意点として、Groovyファイルが一つもないとJavaファイルもコンパイルされません。プロダクトコード側にはGroovyファイルは必要ないってときにも、ダミーのファイルを置いてやる必要があるみたいですね。テストにのみ使用したいという自分の状況だと、これちょっとやるせないな。

設定

以下の説明を含んだ全ての設定は、Github上にあげています。

リポジトリの追加

repository / pluginRepositoryに追加します。URLを見て分かる通り、まだSNAPSHOTバージョンですね。

<repositories>
	<repository>
  		<id>springsource</id>
  		<releases><enabled>true</enabled></releases>
  		<snapshots><enabled>true</enabled></snapshots>
  		<url>http://maven.springframework.org/snapshot</url>
  	</repository>
</repositories>

<pluginRepositories>
  	<pluginRepository>
  		<id>springsource</id>
  		<url>http://maven.springframework.org/snapshot</url>
  	</pluginRepository>
</pluginRepositories>
ビルド定義

まず、maven-compiler-pluginの設定で、デフォルトのJavaコンパイラからGroovyエディタで使用しているコンパイラに変更します。ちなみに、は今回初めて知ったんですが、これC#とかのコンパイラもあるみたいですね。

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>2.3.2</version>

	<configuration>
		<compilerId>groovy-eclipse-compiler</compilerId>
		<verbose>true</verbose>
	</configuration>

	<dependencies>
		<dependency>
			<groupId>org.codehaus.groovy</groupId>
			<artifactId>groovy-eclipse-compiler</artifactId>
			<version>0.5.1-SNAPSHOT</version>
		</dependency>
	</dependencies>
</plugin>

続いて、Eclipse上にインポートしたときにGroovy natureを付ける設定。もちろん、Eclipseを使わない人は必要ありません。

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-eclipse-plugin</artifactId>
	<version>2.8</version>
	<configuration>
		<additionalProjectnatures>
			<additionalProjectnature>org.eclipse.jdt.groovy.core.groovyNature</additionalProjectnature>
		</additionalProjectnatures>
	</configuration>
</plugin>

最後に、src/main/groovyとsrc/test/groovyという、groovy用のソースフォルダを定義します。公式ドキュメントとはちょっと変えて、src/test/groovyはtest用のパスに通すように。

<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>build-helper-maven-plugin</artifactId>
	<version>1.5</version>

	<executions>
		<execution>
			<id>add-source</id>
			<phase>generate-sources</phase>
			<goals>
				<goal>add-source</goal>
			</goals>
			<configuration>
				<sources>
					<source>src/main/groovy</source>
				</sources>
			</configuration>
		</execution>

		<execution>
			<id>add-test-source</id>
			<phase>generate-sources</phase>
			<goals>
				<goal>add-test-source</goal>
			</goals>
			<configuration>
				<sources>
					<source>src/test/groovy</source>
				</sources>
			</configuration>
		</execution>
	</executions>

</plugin>
依存性管理

Groovyを使うので、Groovyを依存ライブラリに追加。

<dependencies>
 	<dependency>
  		<groupId>org.codehaus.groovy</groupId>
  		<artifactId>groovy-all</artifactId>
  		<version>1.7.10</version>
  	</dependency>
</dependencies>

感想

まだスナップショット版ということもあって、これを全面採用は難しいでしょうね。ただ、Groovy-Eclipseエディタは頻繁にバージョンアップしてるので、あまりメンテナンスされてないように見えるGMavenより将来性という点では期待できる・・・かも。


実は、Groovyを読み書きするのはIntelliJ IDEAでやるつもりだったのです。で、Groovyだけ読み書きするのであればIntelliJでいいのですが、今回のように一部Java・一部Groovyの構成だとちょっと面倒。自分にとっては、Java開発はやっぱりEclipseが一番慣れているので。

Groovy-Eclipseエディタもどんどん改良されてるし、やっぱりEclipse一本で通したほうがいいのかな。以前は型推論が確か効かなかったような気がするのですが、今は大体できてるし(クロージャの中はちょっと怪しいけど)。型推論とCtrl+1のクイックフィックスがJDT並にできるようになると、嬉しいんですけどね。

*1:gmaven-archetype-basicは、テストコードの方に不要なimport文が入ったり、groupId/artifactIdがちゃんと設定されなかったりで、結構怪しかったけど。