kaakaa Blog

この世は極楽 空にはとんぼ

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

build.xml

<?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

JUnit実践入門を参考…というか丸写し。
XMLのネストが深くなるのが汚く感じますね。

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のクラスファイルのバージョンを確認する方法 - 出羽ブログ