Ant vs Maven vs Gradle
1. 前書き
この記事では、explore three Java build automation tools which dominated the JVM ecosystem – Ant, Maven, and Gradleを使用します。
それぞれを紹介し、Javaビルド自動化ツールがどのように進化したかを探ります。
2. Apache Ant
In the beginning, Make was the only build automation tool、自社開発のソリューションを超えて. Makeは1976年以来存在しており、そのため、Javaの初期の頃にJavaアプリケーションを構築するために使用されていました。
ただし、Cプログラムの多くの規則がJavaエコシステムに適合しなかったため、やがてAntがより優れた代替手段としてリリースされました。
Apache Ant (“Another Neat Tool”) is a Java library used for automating build processes for Java applications。 さらに、Antは非Javaアプリケーションの構築に使用できます。 最初はApache Tomcatコードベースの一部でしたが、2000年にスタンドアロンプロジェクトとしてリリースされました。
多くの点で、AntはMakeと非常によく似ており、特別な前提条件なしで誰でも使い始めることができるほど単純です。 AntビルドファイルはXMLで記述されており、慣例により、build.xmlと呼ばれます。
ビルドプロセスのさまざまなフェーズは、「ターゲット」と呼ばれます。
HelloWorldメインクラスを持つ単純なJavaプロジェクトのbuild.xmlファイルの例を次に示します。
このビルドファイルは、clean、compile、jar、およびrunの4つのターゲットを定義します。 たとえば、次を実行してコードをコンパイルできます。
ant compile
これにより、最初にターゲットcleanがトリガーされ、「classes」ディレクトリが削除されます。 その後、ターゲットcompileはディレクトリを再作成し、srcフォルダをそのディレクトリにコンパイルします。
The main benefit of Ant is its flexibility. Ant doesn’t impose any coding conventions or project structures.したがって、これは、Antが開発者にすべてのコマンドを自分で作成することを要求することを意味し、保守が困難な巨大なXMLビルドファイルにつながることがあります。
規則がないため、Antを知っているだけでは、Antビルドファイルをすぐに理解できるわけではありません。 なじみのないAntファイルに慣れるまでには時間がかかる可能性があります。これは、他の新しいツールと比較して不利です。
最初は、Antには依存関係管理の組み込みサポートがありませんでした。 ただし、後年、依存関係の管理が必須になったため、Apache IvyはApacheAntプロジェクトのサブプロジェクトとして開発されました。 Apache Antと統合されており、同じ設計原則に従います。
ただし、管理不能なXMLビルドファイルを操作する際の依存関係管理とフラストレーションの組み込みサポートがないため、最初のAntの制限により、Mavenが作成されました。
3. Apache Maven
Apache Mavenは依存関係管理およびビルド自動化ツールであり、主にJavaアプリケーションに使用されます。 Maven continues to use XML files just like Ant but in a much more manageable way.ここでのゲームの名前は、設定より規約です。
Antは柔軟性を提供し、すべてを最初から作成する必要がありますが、Maven relies on conventions and provides predefined commands (goals).
簡単に言えば、Mavenを使用すると、ビルドの実行内容に集中でき、それを実行するためのフレームワークが提供されます。 Mavenのもう1つの利点は、依存関係管理の組み込みサポートを提供したことです。
ビルドと依存関係の管理手順を含むMavenの構成ファイルは、慣例によりpom.xmlと呼ばれます。 さらに、Mavenは厳密なプロジェクト構造も規定していますが、Antはそこにも柔軟性を提供します。
これは、以前のHelloWorldメインクラスを持つ同じ単純なJavaプロジェクトのpom.xmlファイルの例です。
4.0.0
example
mavenExample
0.0.1-SNAPSHOT
Maven example
junit
junit
4.12
test
ただし、現在ではプロジェクト構造も標準化されており、Mavenの規則に準拠しています。
+---src
| +---main
| | +---java
| | | \---com
| | | \---example
| | | \---maven
| | | HelloWorld.java
| | |
| | \---resources
| \---test
| +---java
| \---resources
Antとは対照的に、ビルドプロセスの各フェーズを手動で定義する必要はありません。 代わりに、Mavenの組み込みコマンドを呼び出すだけで済みます。
たとえば、次を実行してコードをコンパイルできます。
mvn compile
公式ページに記載されているように、その核となるのは、Maven can be considered a plugin execution framework, since all work is done by plugins. Mavenが幅広いavailable pluginsをサポートしており、それぞれを追加で構成できることです。
利用可能なプラグインの1つは、依存関係を指定されたディレクトリにコピーするcopy-dependenciesゴールを持つApacheMaven依存関係プラグインです。
このプラグインの動作を示すために、このプラグインをpom.xmlファイルに含め、依存関係の出力ディレクトリを構成しましょう。
org.apache.maven.plugins
maven-dependency-plugin
copy-dependencies
package
copy-dependencies
target/dependencies
このプラグインはpackageフェーズで実行されるため、次のように実行します。
mvn package
このプラグインを実行し、依存関係をtarget / dependenciesフォルダーにコピーします。
さまざまなMavenプラグインを使用して実行可能JARを作成する方法についてもexisting articleがあります。 さらに、Mavenの詳細な概要については、this core guide on Mavenを参照してください。ここでは、Mavenの主要な機能のいくつかについて説明しています。
Mavenは、ビルドファイルが標準化され、Antと比較してビルドファイルの保守にかかる時間が大幅に短縮されたため、非常に人気がありました。 ただし、Maven構成ファイルはAntファイルよりも標準化されていますが、大きくて扱いにくい傾向があります。
Maven’s strict conventions come with a price of being a lot less flexible than Ant.目標のカスタマイズは非常に難しいため、Antと比較して、カスタムビルドスクリプトを作成するのは非常に困難です。
Mavenは、アプリケーションのビルドプロセスをより簡単に、より標準化することに関していくつかの重大な改善を行いましたが、Antよりもはるかに柔軟性が低いため、それでも価格が伴います。 これにより、Antの柔軟性とMavenの機能の両方の長所を組み合わせたGradleが作成されます。
4. Gradle
Gradleは、依存関係管理およびビルド自動化ツールであり、was built upon the concepts of Ant and Maven.
Gradleについて最初に気付くことができることの1つは、AntやMavenとは異なり、XMLファイルを使用していないことです。
時間が経つにつれて、開発者はドメイン固有の言語を使用して作業することにますます興味を持つようになりました。つまり、特定のドメインに合わせた言語を使用して特定のドメインの問題を解決できるようになります。
これは、Groovyに基づくDSLを使用しているGradleによって採用されました。 This led to smaller configuration files with less clutter since the language was specifically designed to solve specific domain problems. Gradleの構成ファイルは慣例によりbuild.gradle.と呼ばれます
これは、以前のHelloWorldメインクラスを持つ同じ単純なJavaプロジェクトのbuild.gradleファイルの例です。
apply plugin: 'java'
repositories {
mavenCentral()
}
jar {
baseName = 'gradleExample'
version = '0.0.1-SNAPSHOT'
}
dependencies {
compile 'junit:junit:4.12'
}
次を実行してコードをコンパイルできます。
gradle classes
Gradleのコア部分では、意図的にほとんど機能を提供しません。 Plugins add all useful features.この例では、Javaコードやその他の貴重な機能をコンパイルできるjavaプラグインを使用していました。
Gradle gave its build steps name “tasks”, as opposed to Ant’s “targets” or Maven’s “phases”. Mavenでは、Apache Maven Dependency Pluginを使用しました。特定の目標は、依存関係を指定されたディレクトリにコピーすることです。 Gradleでは、タスクを使用して同じことができます。
task copyDependencies(type: Copy) {
from configurations.compile
into 'dependencies'
}
以下を実行することにより、このタスクを実行できます。
gradle copyDependencies
5. 結論
この記事では、Ant、Maven、Gradleの3つのJavaビルド自動化ツールを紹介しました。
当然のことながら、Mavenは今日the build tool marketの大部分を保持しています。 しかし、Gradleは、Springなどの多くのオープンソースプロジェクトを含む、より複雑なコードベースで適切に採用されています。