Gradleware は先日,Gradle 1.0 を リリース した。Gradle は Java と Scala, さらに Groovy を対象としたビルドシステムだ。Make や Ant, Ivy, Maven, Rake, Gant, Scons, SBT, Leinengen, Buildr などのツールが持つ優れたアイデアの統合を目標として,Spring や Hibernate などの注目プロジェクトでもすでに利用されている。機能的には,Java 開発者にはすでに馴染みの Maven や Ant/Ivy を使用した一般的なソリューションに近い。
Gradle にはいくつかの興味深い機能がある。
- ビルドスクリプトの記述に (XML ではなく) Groovy を使用
- Java, Scala, さらに Groovy 自体のビルドをサポート
- Maven のリポジトリと互換性を持つ依存性管理
- Ant タスクの積極的活用
- 静的解析ツール (software quality) の組み込みサポート
- 一般的な IDE すべてに GUI インターフェースを用意
- 実用レベルの高速ビルド用 Gradle デーモン
- Gradle 自体を他アプリケーションに統合するプログラミング API
- C++ の試験的 (experimental) サポート
Ant と Maven はいずれも,ビルド定義フォーマットとして XML を採用している。XML は可読性に優れ,良質のツールサポートを備える反面,制御ロジックの表現方法としては必ずしも便利ではない。Gradle はこの問題を,ビルド定義フォーマットに完全なプログラム言語 (Groovy) を採用することで克服した。これによって,プログラム言語の持つパワーがビルド定義で利用可能になった。フロー条件やデータ変数など,プログラムを構成するすべての要素がビルドプロセスに容易に組み込めるようになったのだ。
例えば Gradle の Task (Ant のターゲットに相当する) は,それ自身が プログラムとしての構成 を持っている。以下はその概念を示す Gradle ビルドファイルの例である。
// Use the default greeting task hello(type: GreetingTask) // Customize the greeting task greeting(type: GreetingTask) { greeting = 'greetings from GreetingTask' } class GreetingTask extends DefaultTask { def String greeting = 'hello from GreetingTask' @TaskAction def greet() { println greeting } }
実行すると次のように表示される。
$gradle -q hello greeting hello from GreetingTask greetings from GreetingTask
一目見ればこの機能が,Gradle を(Ant のように) 柔軟性に富んだ,強力なツールにしていることが分かる。一方で Gradle は,Ant のパワーと Maven の厳格性の間にある,スイートスポットを見つけ出そうともしている。サポート対象の各言語には,最も一般的な操作の定義済みタスクと,それぞれのプラグインが用意されている。ビルドファイルで Java プラグイン をアクティベートすれば,同時に clean,compile,javadoc,build,test,check といった一連のタスクも定義される,という具合だ。
依存関係を扱う方法は Maven と同様である。Gradle は Maven レポジトリを使用可能である。バージョン 1.0 以前は Ivy (これも Maven と互換性を持っている) を使用して依存性管理を行っていたが,1.0 バージョンからは独自の依存性管理のメカニズムを実装している。次の例では,Maven との類似性を示している。
apply plugin: 'java' repositories { mavenCentral() } dependencies { compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final testCompile group: 'junit', name: 'junit', version: '4.+' }
Gradle は既存の Ant ビルドとも互換性がある。Ant タスク定義が利用可能なのに加えて,build.xml ファイルをインポート することもできる。FindBugs や PDM, Checkstyle, JDepend, CodeNarc, さらには Sonar といった品質管理ツールを統合するためのプラグインも提供されている。
パフォーマンス上の理由から,Gradle にはデーモンも用意されている。デーモンがアクティブである間は,ビルドスクリプトが受け入れ可能である。最初に起動することで Gradle の開始 (と停止) に伴うオーバーヘッドを回避できることから,ビルドのスピードも向上する。ユニットテスト中のように多数のビルドを次々に実行する場合には,このテクニックが特に有効だ。
最後に Gradle には,プロジェクトソースコードへの統合を可能にする,特殊な ラッパ が付属している。Grandle を事前インストールしなくても作業が可能になるので,自己完結的なビルドを定義することができる。実際これは Maven の弱点のひとつでもある。Maven プロジェクトは,Maven をインストール済みの環境上に構築する必要があるのだ。
Gradle に関する詳細については,関連資料 や リリースノート,ロードマップ を参照してほしい。Maven の制約が厳し過ぎると思うのなら,代替のビルドシステムとして Gradle はよい選択だろう。