1. 序章

この記事では、JVMエコシステムを支配する3つのビルド自動化ツール(Ant、Maven、Gradle )について説明します。

それぞれを紹介し、Javaビルド自動化ツールがどのように進化したかを探ります。

2. Apache Ant

当初、Makeは自社開発のソリューション以外で利用できる唯一のビルド自動化ツールでした。 Makeは1976年以来存在しており、Javaアプリケーションの構築に使用されていました。 。

ただし、Cプログラムの多くの規則がJavaエコシステムに適合しなかったため、やがてAntがより良い代替手段として引き継がれました。

Apache Ant(「AnotherNeat Tool」)は、Javaアプリケーションのビルドプロセスを自動化するために使用されるJavaライブラリです。 さらに、AntはJava以外のアプリケーションの構築にも使用できます。 当初はApacheTomcatコードベースの一部であり、2000年にスタンドアロンプロジェクトとしてリリースされました。

多くの点で、AntはMakeと非常によく似ており、特別な前提条件なしで誰でも使い始めることができるほど単純です。 AntビルドファイルはXMLで記述されており、慣例により、build.xmlと呼ばれます。

ビルドプロセスのさまざまなフェーズは「ターゲット」と呼ばれます。

次に、HelloWorldメインクラスを持つ単純なJavaプロジェクトのbuild.xmlファイルの例を示します。

<project>
    <target name="clean">
        <delete dir="classes" />
    </target>

    <target name="compile" depends="clean">
        <mkdir dir="classes" />
        <javac srcdir="src" destdir="classes" />
    </target>

    <target name="jar" depends="compile">
        <mkdir dir="jar" />
        <jar destfile="jar/HelloWorld.jar" basedir="classes">
            <manifest>
                <attribute name="Main-Class" 
                  value="antExample.HelloWorld" />
            </manifest>
        </jar>
    </target>

    <target name="run" depends="jar">
        <java jar="jar/HelloWorld.jar" fork="true" />
    </target>
</project>

このビルドファイルは、 clean compile jar runの4つのターゲットを定義します。 たとえば、次のコマンドを実行してコードをコンパイルできます。

ant compile

これにより、最初にターゲット clean がトリガーされ、「classes」ディレクトリが削除されます。 その後、ターゲット compile はディレクトリを再作成し、srcフォルダをそのディレクトリにコンパイルします。

Antの主な利点は、その柔軟性です。 Antは、コーディング規則やプロジェクト構造を強制しません。 したがって、これは、Antが開発者にすべてのコマンドを自分で作成することを要求することを意味し、保守が困難な巨大なXMLビルドファイルにつながることがあります。

規則がないため、Antを知っているだけでは、Antビルドファイルをすぐに理解できるわけではありません。 なじみのないAntファイルに慣れるまでには時間がかかる可能性があります。これは、他の新しいツールと比較して不利です。

当初、Antには依存関係管理のサポートが組み込まれていませんでした。 ただし、後年、依存関係の管理が必須になったため、 ApacheIvyはApacheAntプロジェクトのサブプロジェクトとして開発されました。 Apache Antと統合されており、同じ設計原則に従います。

ただし、依存関係管理のサポートが組み込まれていないことによる初期のAntの制限と、管理できないXMLビルドファイルを操作する際のフラストレーションにより、Mavenが作成されました。

3. Apache Maven

Apache Maven は、依存関係管理およびビルド自動化ツールであり、主にJavaアプリケーションに使用されます。 Mavenは引き続きAntと同じようにXMLファイルを使用しますが、はるかに管理しやすい方法で使用します。 ここでのゲームの名前は設定より規約です。

Antは柔軟性を提供し、すべてを最初から作成する必要がありますが、 Mavenは規則に依存し、事前定義されたコマンド(目標)を提供します。

簡単に言えば、Mavenを使用すると、ビルドで実行する必要があることに集中でき、それを実行するためのフレームワークが提供されます。 Mavenのもう1つの良い面は、依存関係管理の組み込みサポートを提供したことです。

ビルドおよび依存関係の管理命令を含むMavenの構成ファイルは、慣例によりpom.xmlと呼ばれます。 さらに、Mavenは厳密なプロジェクト構造も規定していますが、Antはそこでも柔軟性を提供します。

これは、以前のHelloWorldメインクラスを持つ同じ単純なJavaプロジェクトのpom.xmlファイルの例です。

<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>baeldung</groupId>
    <artifactId>mavenExample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <description>Maven example</description>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

ただし、プロジェクト構造も標準化され、Mavenの規則に準拠しています。

+---src
|   +---main
|   |   +---java
|   |   |   \---com
|   |   |       \---baeldung
|   |   |           \---maven
|   |   |                   HelloWorld.java
|   |   |                   
|   |   \---resources
|   \---test
|       +---java
|       \---resources

Antとは対照的に、ビルドプロセスの各フェーズを手動で定義する必要はありません。 代わりに、Mavenの組み込みコマンドを呼び出すだけで済みます。

たとえば、次のコマンドを実行してコードをコンパイルできます。

mvn compile

基本的に、公式ページに記載されているように、 Mavenは、すべての作業がプラグインによって行われるため、プラグイン実行フレームワークと見なすことができます。それらのうち、追加で構成することができます。

利用可能なプラグインの1つは、 copy-dependencies の目標を持ち、依存関係を指定されたディレクトリにコピーするApacheMaven依存関係プラグインです。

このプラグインの動作を示すために、このプラグインを pom.xml ファイルに含め、依存関係の出力ディレクトリを構成しましょう。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/dependencies
                          </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

このプラグインはパッケージフェーズで実行されるため、次のコマンドを実行すると次のようになります。

mvn package

このプラグインを実行し、依存関係をtarget/dependenciesフォルダーにコピーします。

さまざまなMavenプラグインを使用して実行可能JARを作成する方法に関する既存の記事もあります。 さらに、Mavenの詳細な概要については、 Mavenに関するこのコアガイドを参照してください。ここでは、Mavenの主要な機能のいくつかについて説明しています。

ビルドファイルが標準化され、Antと比較してビルドファイルの保守にかかる時間が大幅に短縮されたため、Mavenは非常に人気がありました。 ただし、Antファイルよりも標準化されていますが、Maven構成ファイルは依然として大きくて扱いにくい傾向があります。

Mavenの厳格な規則には、Antよりもはるかに柔軟性が低いという代償が伴います。目標のカスタマイズは非常に難しいため、Antと比較してカスタムビルドスクリプトを作成するのは非常に困難です。

Mavenは、アプリケーションのビルドプロセスをより簡単に、より標準化することに関していくつかの重大な改善を行いましたが、Antよりもはるかに柔軟性が低いため、それでも代償が伴います。 これにより、Antの柔軟性とMavenの機能の両方の長所を組み合わせたGradleが作成されます。

4. Gradle

Gradle は、依存関係管理およびビルド自動化ツールであり、はAntとMavenの概念に基づいて構築されています。

Gradleについて最初に気付くことができることの1つは、AntやMavenとは異なり、XMLファイルを使用していないことです。

時間の経過とともに、開発者はドメイン固有言語を使用して作業することにますます関心を持つようになりました。つまり、特定のドメインに合わせた言語を使用して、特定のドメインの問題を解決できるようになります。

これは、GroovyまたはKotlinに基づくDSLを使用しているGradleによって採用されました。 言語は特定のドメインの問題を解決するように特別に設計されているため、これにより構成ファイルが小さくなり、混乱が少なくなりました。 Gradleの構成ファイルは、慣例により、Groovyでは build.gradle 、またはと呼ばれます。 Kotlinのbuild.gradle.kts

Kotlinは、オートコンプリートとエラー検出に関してGroovyよりも優れたIDEサポートを提供していることに注意してください。

これは、以前のHelloWorldメインクラスを持つ同じ単純なJavaプロジェクトのbuild.gradleファイルの例です。

apply plugin: 'java'

repositories {
    mavenCentral()
}

jar {
    baseName = 'gradleExample'
    version = '0.0.1-SNAPSHOT'
}

dependencies {
    testImplementation 'junit:junit:4.12'
}

次のコマンドを実行してコードをコンパイルできます。

gradle classes

基本的に、Gradleは意図的にほとんど機能を提供しません。 プラグインはすべての便利な機能を追加します。この例では、Javaコードやその他の貴重な機能をコンパイルできるjavaプラグインを使用していました。

Gradleは、Antの「ターゲット」やMavenの「フェーズ」ではなく、ビルドステップに「タスク」という名前を付けました。 Mavenでは、Apache Maven依存関係プラグインを使用しました。これは、依存関係を指定されたものにコピーするという特定の目標です。ディレクトリ。 Gradleでは、タスクを使用して同じことを行うことができます。

task copyDependencies(type: Copy) {
   from configurations.compile
   into 'dependencies'
}

次を実行することで、このタスクを実行できます。

gradle copyDependencies

5. 結論

この記事では、3つのJavaビルド自動化ツールであるAnt、Maven、およびGradleを紹介しました。

当然のことながら、Mavenは今日ビルドツール市場の大部分を占めています。

ただし、Gradleは、次の理由により、より複雑なコードベースで適切に採用されています。

  • Springなどの多くのオープンソースプロジェクトが現在それを使用しています
  • インクリメンタルビルドのおかげで、ほとんどのシナリオでMavenよりも高速です
  • 高度な分析およびデバッグサービスを提供します

ただし、特にGroovyやKotlinに慣れていない場合は、Gradleの学習曲線が急になるようです。