ライブラリとして使うコードを gradle でビルドしてローカルの開発環境で共有する方法のメモ。
基本的には簡単なのだが、
gradle, groovy , grape, maven などを複数の技術を併用する結果かなり混乱するので整理してみた。
といった環境でテストしています。
hello.jar というライブラリを作成してローカルの maven レポジトリに配置します。
簡単な例として 名前を渡すと 挨拶する hello.jar ライブラリを考えます。
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)
}
}
gradle の maven plugin を使う点です。
普通のgroovyのgradleによるビルド設定に加えて、以下のような追加記述を入れます。
apply plugin:'maven'
archivesBaseName = "hello"
group='org.notehub.example'
version='0.1'
install.doFirst 部分です。
install.doFirst {}
これはライブラリを作成して maven のローカルレポジトリに入れるところまでには無関係なのですが、
その後、このライブラリを groovy や gradle での別の groovy プロジェクトで使う場合に関係があります。
install.doFirst 内では、指定のディレクトリを削除しているのですが、
これは gradle,groovy の hello.jar ライブラリのキャッシュディレクトリです。
このキャッシュを削除しないまま、ライブラリ側のコードを変更して gradle install しても、
ライブラリを利用する側の groovy や gradle のキャッシュをクリアしておかないとその変更が反映されません。
したがって、ライブラリをインストールする前に、groovy と gradle のキャッシュを削除しています。
> なお、このライブラリを grails から使う場合は、
> ~/.ivy2/cache/ 以下の該当ディレクトリを削除しておく必要があります。
$ gradle install
> 実際には デフォルトタスクとして install が指定されているため
> gradle としても結果は同じです。
この結果以下のディレクトリに hello-0.1.jar が配置されます。
hello.jar ライブラリを
2-1) groovy(#2_1) ,
2-2) gradle による groovy プロジェクト(#2_2) から使う場合です。
h3. 2-1) groovy から hello.jar を使う場合
groovy から使う場合には2つのやり方があります。
@GrabResolver 内の指定は変数は使えないようです。
ここでは /home/foo と書いていますが、_foo_ には実際のユーザ名を入れる必要があります。
(MacOSXなどでは、/Users/foo 等になります。)
@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/")
のような記述は作動しなかった。
~/.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 でビルドする別のプロジェクトから使う場合
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 にて作動をテストする。