gradle の maven plugin を使ってローカルレポジトリに入れた自前の jar を groovy や gradle から使う方法 date:2010-12-13

ライブラリとして使うコードを gradle でビルドしてローカルの開発環境で共有する方法のメモ。

基本的には簡単なのだが、
gradle, groovy , grape, maven などを複数の技術を併用する結果かなり混乱するので整理してみた。

といった環境でテストしています。

1) ライブラリの用意

hello.jar というライブラリを作成してローカルの maven レポジトリに配置します。
簡単な例として 名前を渡すと 挨拶する hello.jar ライブラリを考えます。

gradle のプロジェクトを作成


h3. Hello.groovy


package org.notehub.example

class Hello {
    String greeting(String name){ "Hello ${name}!" }
}


h3. build.gradle


defaultTasks 'install'

apply plugin: 'groovy'
apply plugin:'maven'

archivesBaseName = "hello"

group='org.notehub.example'
version='0.1'

repositories {
    mavenCentral()
}

dependencies {
	groovy group: 'org.codehaus.groovy', name:'groovy',       version:'1.7.5'
}


install.doFirst {
	def dir = null

	dir = new File(System.getProperty('user.home'), '.gradle/cache/org.notehub.example').absolutePath
	if( new File(dir).exists() ){
		ant.echo("Remove gradle-cache-dir : ${dir}")
		ant.delete(dir:dir)
	}

	dir = new File(System.getProperty('user.home'), '.groovy/grapes/org.notehub.example').absolutePath
	if( new File(dir).exists() ){
		ant.echo("Remove gradle-cache-dir : ${dir}")
		ant.delete(dir:dir)
	}
}

ポイント1

gradle の maven plugin を使う点です。
普通のgroovyのgradleによるビルド設定に加えて、以下のような追加記述を入れます。


apply plugin:'maven'
archivesBaseName = "hello"
group='org.notehub.example'
version='0.1' 

ポイント2

install.doFirst 部分です。


install.doFirst {}

これはライブラリを作成して maven のローカルレポジトリに入れるところまでには無関係なのですが、
その後、このライブラリを groovy や gradle での別の groovy プロジェクトで使う場合に関係があります。

install.doFirst 内では、指定のディレクトリを削除しているのですが、
これは gradle,groovy の hello.jar ライブラリのキャッシュディレクトリです。

このキャッシュを削除しないまま、ライブラリ側のコードを変更して gradle install しても、
ライブラリを利用する側の groovy や gradle のキャッシュをクリアしておかないとその変更が反映されません。
したがって、ライブラリをインストールする前に、groovy と gradle のキャッシュを削除しています。

> なお、このライブラリを grails から使う場合は、
> ~/.ivy2/cache/ 以下の該当ディレクトリを削除しておく必要があります。

hello.jar をローカルの maven レポジトリにインストール


$ gradle install

> 実際には デフォルトタスクとして install が指定されているため
> gradle としても結果は同じです。

この結果以下のディレクトリに hello-0.1.jar が配置されます。

2) ライブラリを利用する

hello.jar ライブラリを
2-1) groovy(#2_1) ,
2-2) gradle による groovy プロジェクト(#2_2) から使う場合です。


h3. 2-1) groovy から hello.jar を使う場合

groovy から使う場合には2つのやり方があります。

  1. 2-1-1) @GrabResolverを使う
  2. 2-1-2) ~/groovy/grapeConfig.xml を編集する

2-1-1) @GrabResolverを使う

@GrabResolver 内の指定は変数は使えないようです。
ここでは /home/foo と書いていますが、_foo_ には実際のユーザ名を入れる必要があります。
(MacOSXなどでは、/Users/foo 等になります。)

test.groovy


@GrabResolver(name='local', root='file:/home/foo/.m2/repository/')
@Grab(group='org.notehub.example', module='hello', version='0.1')

import org.notehub.example.*

println new Hello().greeting('gradle')

GrabResolver内では変数が使えないようなので注意(groovy 1.7.5 で確認)
たとえば...

 @GrabResolver(name='local', root="file:${System.getProperty('user.home')}/.m2/repository/") 

のような記述は作動しなかった。

2-1-2) ~/.groovy/grapeConfig.xml を編集する

~/.groovy/grapeConfig.xml を以下のように編集します。(または存在していない場合は作成)


<ivysettings>
  <settings defaultResolver="downloadGrapes"/>
  <resolvers>
    <chain name="downloadGrapes">
      <filesystem name="cachedGrapes">
        <ivy pattern="${user.home}/.groovy/grapes/[organisation]/[module]/ivy-[revision].xml"/>
        <artifact pattern="${user.home}/.groovy/grapes/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"/>
      </filesystem>
      <!-- todo add 'endorsed groovy extensions' resolver here -->
      <ibiblio name="codehaus" root="http://repository.codehaus.org/" m2compatible="true"/>
      <ibiblio name="ibiblio" m2compatible="true"/>
      <ibiblio name="java.net2" root="http://download.java.net/maven/2/" m2compatible="true"/>
      <ibiblio name="local" root="file:${user.home}/.m2/repository/" m2compatible="true"/>
    </chain>
  </resolvers>
</ivysettings>

ポイントは以下の行を追加する点。


<ibiblio name="local" root="file:${user.home}/.m2/repository/" m2compatible="true"/>


h3. 2-2) gradle でビルドする別のプロジェクトから使う場合

gradle のプロジェクトを作成


h4. Test.groovy


class Test {
    public static void main(String[] s){
        println new org.notehub.example.Hello().greeting('gradle')
    }
}


h4. build.gradle


defaultTasks 'build'

apply plugin: 'groovy'
//apply plugin:'maven'

archivesBaseName = "test"


repositories {
	mavenCentral()
	mavenRepo urls: 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath
}

dependencies {
	groovy group: 'org.codehaus.groovy', name:'groovy',       version:'1.7.5'
	compile group: 'org.notehub.example', name:'hello',       version:'0.1'
}

jar {
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}

manifest.mainAttributes("Main-Class" : "Test")

ポイントは...

作動テスト

test/build/libs/test.jar が生成されるので、 java -jar test/build/libs/test.jar にて作動をテストする。