| 訳注 以下はGroovy 1.6時点の情報です。1.7での変更点についてはGroovy 1.7のリリースノートを参照してください。 |
Grape (The Groovy Adaptable Packaging Engine または Groovy Advanced Packaging Engine) は、Groovyでgrab()呼び出しを可能にする基盤であり、Groovyのリポジトリベースのモジュールシステムを実現するためのIvyを活用した一連のクラスです。これによって、開発者が何らかのライブラリを必須とするスクリプトを書いても、そのスクリプトのみをリリースすることが可能になります。スクリプトが、IbiblioやCodehaus、java.netのような既存のリポジトリに基づいて実行されるとき、Grapeは(実行時に)必要に応じて指定されたライブラリやそのすべての依存物をダウンロードし、リンクします。
基本
Grapeは、モジュールのバージョン識別に関しては(用語の変更はありますが)、Ivyのやり方に従っています。
group- モジュールが所属するモジュールグループ。MavenのgroupIdやIvyのOrganizationに相当。/groovy[x][\..*]^/にマッチするグループは予約されていて、Groovyの標準モジュールとして特別な意味を持つ場合がある。module- ロードするモジュールの名前。MavenのartifactIdやIvyのartifactに相当。version- 利用するモジュールのバージョン。'1.1-RC3' のようなリテラルバージョンかIvyの範囲。例えば '[2.2.1,)' はバージョン2.2.1以降の意味。
ダウンロードされたモジュールは、キャッシュルート ~/.groovy/grape の下に、Ivyの標準メカニズムに従って保存されます。
使用方法
アノテーション
アノテーションが許されている場所であればどこでも、いくつでもgroovy.lang.Grabアノテーションを付けて、そのコードが特定のライブラリに依存していることをコンパイラに知らせることができます。これは、Groovyコンパイラのクラスローダにそのライブラリを追加する効果があります。このアノテーションは、スクリプト内の他のあらゆるクラス解決に先だって検出・評価されるので、@Grabアノテーションによって取り込まれたクラスも適切に解決されます。
対象クラス(スクリプト要素へのアノテーションの場合はScriptクラス)のstaticイニシャライザに、適切な grab(...) 呼び出しが追加されます。
複数のGrapeアノテーション
複数のGrapeアノテーションを使うためには、Grapesアノテーションを使う必要があります。例:
こうしないと、次のエラーが発生してしまうでしょう:
.
メソッド呼び出し
通常、grabの呼び出しはスクリプト/クラス初期化の早い段階に起こります。これは、groovyコードが対象コードに依存する前に、クラスローダがそのライブラリを利用できるようになっていることを保証するためです。よくある呼び出し例を以下に示します。
* 同じコンテキスト、同じパラメータで何回grabを呼び出しても効果は同じになります。ただし、同じコードでも異なるクラスローダコンテキストで呼び出せば、再度依存性の解決が実行されます。
grabはデフォルトでは利用できなくなっています。Grape.initGrape()を呼ぶことで利用可能になります。initGrape()以前にgrabを呼んでも無視されます。Grape管理下でのクラスローディングはあくまでオプションだからです。一度呼び出しに成功した後は、何度Grape.initGrape()を呼んでも無視されます。grab呼び出しに渡されるargsマップのnoExceptions属性が true と評価される場合、例外は発生しなくなります。grabでは、RootLoaderまたはGroovyClassLoaderが指定されるか、あるいは呼び出し元クラスのクラスローダチェインの中に存在することが必要です。デフォルトでは、これらのクラスローダが利用できないと、モジュール解決で例外が発生します(initGrape()が呼ばれている場合)。classLoader:引数で渡されたクラスローダと、その親クラスローダreferenceObject:引数で渡されたオブジェクトのクラスローダと、その親クラスローダgrabの呼び出し元クラスのクラスローダ
grab(HashMap) パラメータ
group:- <String> - モジュールが属するモジュールグループ。MavenのgroupIdに相当。/groovy(|\..|x|x\..)/にマッチするグループは予約されていて、Groovyの標準モジュールとして特別な意味を持つ場合がある。module:- <String> - ロードするモジュールの名前。MavenのartifactIdに相当。version:- <String> または <Range> - 利用するモジュールのバージョン。'1.1-RC3' のようなリテラルバージョンかIvyの範囲。例えば '[2.2.1,)' はバージョン2.2.1以降の意味。classifier:- <String> - 解決時に使うMavenのclassifierconf:- <String>, デフォルトは'default' - ダウンロードするモジュールの設定やスコープ。confのデフォルトはdefault:で、mavenのruntimeとmasterスコープに対応する。force:- <boolean>, デフォルトはtrue - コンフリクト発生時に、コンフリクトマネージャとは無関係に必ずこのリビジョンが必要であることを示す。changing:- <boolean>, デフォルトはfalse - バージョン名は同じままでartifactが変更されることがあるか。transitive:- <boolean>, デフォルトはtrue - このモジュールが、解決すべき他の依存関係を持っているかどうか。
grab には二つの主要なバリエーションがあります。単一のMapをとるものと、引数Mapおよび複数の依存先Mapをとるものです。一つのマップをとるgrabの呼び出しは、同じマップを二回渡してgrabを呼ぶのと同じことです。grabの引数と依存先は一つのマップに合成されるので、名前付きパラメータをとる単一のメソッドとしてgrabを呼び出すことも可能です。
これらのパラメータには別名も用意されています。複数種を使うと実行時例外になります。
group:,groupId:,organisation:,organization:,org:module:,artifactId:,artifact:version:,revision:,rev:conf:,scope:,configuration:
引数Mapの引数
classLoader:- <GroovyClassLaoder> または <RootClassLoader> - 解決されたJarを追加するクラスローダrefObject:- <Object> - このオブジェクトのクラスの直接の親クラスローダがclassLoader:で指定されたように扱われる。validate:- <boolean>, デフォルトはfalse - pomやivy関連ファイルを検証すべきか(true)、またはキャッシュを信用するか(false)。noExceptions:- <boolean>, デフォルトはfalse - クラスローダの解決やリポジトリの問い合わせが失敗したとき、例外を発生させるか(false)、または黙って失敗するか(true)
コマンドラインツール
Grapeでは、ローカルgrapeキャッシュの検査や管理のために、コマンドラインから実行可能な 'grape' コマンドが追加されました。
これは指定されたgroovyモジュールまたはmaven artifactをインストールします。バージョンを指定した場合はそのバージョンがインストールされ、省略されれば('*'を指定したときのように)最新のバージョンが使われます。
ローカルにインストールされているモジュールとそのバージョンを(groovyモジュールについてはそのフルmaven名と共に)一覧表示します。
指定されたモジュールおよびそれが依存するモジュールに対応するjarファイルの場所を返します。オプションで -ant, -dos, -shell などを指定すれば、それぞれAntスクリプト、Windowsバッチファイル、Unixシェルスクリプトなどに適した形式で取得できます。-ivy を指定すれば、ivyに適した形式で表示することも可能です。
高度な設定
プロキシ設定
ファイアウォールの存在などで、プロキシサーバ経由でGroovy/Grapeを使う必要がある場合、http.proxyHostおよびhttp.proxyPortシステムプロパティを使って、コマンドにその設定を指定できます:
あるいは、JAVA_OPTS環境変数にこれらのプロパティを追加することで、これをシステムワイドに設定することもできます:
リポジトリディレクトリ
grapeがライブラリのダウンロードに使うディレクトリを変更する必要がある場合、grape.rootシステムプロパティを指定して、デフォルト値(~/.groovy/grape)を変えることができます。
Ivy設定のカスタマイズ
//TODO grapeConfig.xmlについてもっと詳しく
~/.groovy/grapeConfig.xmlファイルを作成することで、Grapeが使うivyの設定をカスタマイズすることができます。このファイルが存在しないときは、これがGrapeが使うデフォルト設定になります:
この設定のカスタマイズ方法の詳細は、Ivyのドキュメントを参照してください。
ローカルなMaven2リポジトリの追加
自前のローカルなMaven2リポジトリの中の既存のartifactを再利用したい場合には、~/.groovy/grapeConfig.xml に次の行を追加することができます:
そしてGrape設定を次のようにカスタマイズします:
利用例
Apache Commonsコレクションの利用:
TagSoupの利用:
Googleコレクションの利用:
Groovyテンプレートが使えるJettyサーバの起動:
このスクリプトの最初の起動時に、GrapeはJettyとそれが依存するモジュールをダウンロードし、キャッシュします。新しいJetty Serverをポート8080で生成し、コンテキストのルートでGroovyのTemplateServletを使えるようにします(Groovyには強力なテンプレートエンジンメカニズムが備わっています)。そしてサーバを起動し、一定時間実行させます。誰かがhttp://localhost:8080/somepage.gspにアクセスするたびに、ユーザにはsomepage.gspテンプレートが表示されるでしょう。このテンプレートページはサーバスクリプトと同じディレクトリに置く必要があります。
関連情報:
Using Hibernate with Groovy
http://stackoverflow.com/questions/192432/getting-groovys-grape-going