GradleとMavenとAnt+ivyの比較
JUnit実践入門見ながらMaven試してたら、いつのまにか3つのビルドスクリプト比較してた。
簡単なスクリプトだけど、Gradleの簡便さが分かると思います。
【やりたいこと】
以上。
ついでに、それぞれ一回実行して、jarがローカルにキャッシュされた状態での実行時間も測ってみました。
コンパイル対象は以下の2クラス。
Sample.java
package org.sample; public class Sample { public static void main(String[] args){ System.out.println("Hello World!"); } }
SampleTest.java
package org.sample; import org.junit.Test; public class SampleTest { @Test public void testSample(){ Sample.main(null); } }
Ant
<?xml version="1.0" encoding="UTF-8"?> <project name="MavenSample" default="run" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant"> <property name="src.dir" value="src/main/java" /> <property name="test.dir" value="src/test/java" /> <property name="lib.dir" value="lib"/> <property name="build.dir" value="ant"/> <property name="compiler" value="/path/to/javac" /> <path id="lib.path.id"> <fileset dir="${lib.dir}"/> </path> <target name="resolve"> <ivy:retrieve/> </target> <target name="run" depends="resolve"> <mkdir dir="${build.dir}" /> <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="lib.path.id" executable="${compiler}" encoding="UTF-8"/> <javac srcdir="${test.dir}" destdir="${build.dir}" classpathref="lib.path.id" executable="${compiler}" encoding="UTF-8"/> </target> </project>
ivy.xml
<ivy-module version="2.0"> <info organisation="MavenSample" module="MavenSample"/> <dependencies> <dependency org="junit" name="junit" rev="4.11"/> </dependencies> </ivy-module>
実行。
ant
処理時間
real 0m2.065s user 0m2.280s sys 0m0.179s
Antを使う場合は、依存関係解決のためにivy.xmlも書く必要があります。
javacタスク周りは、もう少し簡単に書くことが出来るかもしれない。Ant弱者なので愚直にしか書けません。
テスト実行は面倒なので諦めました。
Maven
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>MavenSample</groupId> <artifactId>MavenSample</artifactId> <version>1.0</version> <properties> <project.build.sourceEncoding>utf-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build> </project>
実行。
mvn test
処理時間
real 0m5.199s user 0m7.595s sys 0m0.541s
Gradle
apply plugin: 'java' group = 'MavenSample' version = '1.0' project.ext { artifactId = 'MavenSample' } sourceCompatibility = 1.7 targetCompatibility = 1.7 def defaultEncoding = 'UTF-8' [compileJava, compileTestJava]*.options*.encoding = defaultEncoding repositories{ mavenCentral() } dependencies{ testCompile 'junit:junit:4.11' }
実行。
gradle test
処理時間
real 0m6.895s user 0m11.012s sys 0m0.657s
もう言葉は要らないですね。
簡単です。
3つ実行してみて、Ant+ivy以外は指定しなくてもSample.classとSampleTest.classが然るべきディレクトリに分かれてコンパイルされてます。
Antはコンパイル先を指定してあげなくてはいけません。
さらに、Ant以外はテスト実行までしてくれてます。Antは(ry
MavenとGradleを比べると、Gradleの方はテストを実行するだけでなく、こんなレポートまで自動で作ってくれています。
まぁ、基本的にはJenkinsでテスト結果のXMLファイルを表示してくれるので、あまり使わないとは思いますが、Jenkinsに載せるまでもないプロトとかだと使えるかも…。まぁ、Jenkinsに載せるほどでも無ければ、テストもそんなに書かない気もしますが。
やっぱりGradleの一番の魅力は記述量の少なさですね。
XMLブームの時代を知らないペーペーの自分には、XML形式の冗長性がどうにも慣れないので、自分の中ではGradle以外の選択肢は考えられないです。
まだ情報は少ないですが、公式リファレンスが充実してるので、あまり問題無いかと。
Gradle 日本語ドキュメント
Gradle DSL Version 1.5-20130308082157+0000
さらにはAntタスクをそのまま継承して使えたりできるので、Antを使う理由はもう無いですね。
そんなGradleのハンズオンが今週の金曜日に開催されるようなので、ご興味のある方は参加してみたらいかがでしょうか。
G*ワークショップZ Mar 2013 - 日本Grails/Groovyユーザーグループ
参考:
Apache Ivyの紹介と基本的な使い方 - 達人プログラマーを目指して
MessagePack-RPC(Java Binding)を ivy でインストールする | Synergy Marketing LAB BLOG
Qiita - Maven プロジェクトを Gradle プロジェクトにする(誇張)
Javaのクラスファイルのバージョンを確認する方法 - 出羽ブログ