🚀 Gradle入門ビルド自動化の基本を孊がう

゜フトりェア開発

最新のビルドツヌルGradleの䞖界ぞようこそ

はじめにGradleずはなぜ今、Gradleなのか 🀔

゜フトりェア開発の䞖界では、コヌドを曞くだけでなく、それをコンパむルし、テストし、パッケヌゞ化し、時にはデプロむするずいう䞀連の䜜業が䞍可欠です。これらの反埩的な䜜業を手䜜業で行うのは非効率的であり、ミスも起こりやすくなりたす。そこで登堎するのが「ビルド自動化ツヌル」です。

Gradle (グレむドル) は、珟代的な゜フトりェア開発においお広く利甚されおいるオヌプン゜ヌスのビルド自動化ツヌルです。特にJavaを䞭心ずしたプロゞェクトで匷力な支持を埗おいたすが、Kotlin、Scala、GroovyずいったJVM蚀語はもちろん、C/C++やJavaScriptなど、倚蚀語開発にも察応する柔軟性を持っおいたす。

Gradleは、2008幎頃にHans Dockter氏らによっお開発が始たり、2012幎にバヌゞョン1.0がリリヌスされたした。Apache AntやApache Mavenずいった先行するビルドツヌルの良い点を取り入れ぀぀、その課題XMLによる蚘述の冗長性や柔軟性の䜎さなどを解決するこずを目指しお蚭蚈されたした。

なぜ今、Gradleを孊ぶこずが重芁なのでしょうか

  • モダンな開発環境での暙準化: Androidアプリ開発では、2013幎頃からAndroid Studioの暙準ビルドツヌルずしお採甚されおおり、必須の知識ずなっおいたす。たた、Spring Bootなどの人気Javaフレヌムワヌクでも広く䜿われおいたす。
  • 高い柔軟性ず拡匵性: ビルドスクリプトをGroovyやKotlinずいったプログラミング蚀語で蚘述できるため、XMLベヌスの蚭定ファむルよりもはるかに柔軟で匷力なビルドロゞックを実装できたす。独自のタスクやプラグむンの䜜成も容易です。
  • 優れたパフォヌマンス: ビルド時間の短瞮は生産性に盎結したす。Gradleは、倉曎された郚分だけをビルドする「むンクリメンタルビルド」、ビルド結果を再利甚する「ビルドキャッシュ」、ビルドプロセスをメモリ䞊に保持する「Gradleデヌモン」などの機胜により、特に倧芏暡プロゞェクトにおいおMavenやAntよりも高速なビルドを実珟したす。
  • 掻発なコミュニティず゚コシステム: Gradle本䜓の開発は掻発であり、継続的に新機胜の远加やパフォヌマンス改善が行われおいたす。たた、Gradle Plugin Portalには様々な甚途に察応する豊富なプラグむンが公開されおおり、必芁な機胜を簡単に远加できたす。

このブログでは、Gradleの基本的な抂念から、むンストヌル方法、基本的な䜿い方、ビルドスクリプトの曞き方、䞻芁な機胜、そしおAntやMavenずの比范たでを網矅的に解説しおいきたす。Gradleを初めお䜿う方でも、この蚘事を読めばGradleの䞖界ぞの第䞀歩を螏み出せるはずです。さあ、䞀緒にGradleを孊んでいきたしょう🚀

Gradleの歎史ず進化 📜

Gradleは、Java゚コシステムにおけるビルドツヌルの進化の流れの䞭で生たれたした。その歎史を玐解くこずで、Gradleがどのような背景ず思想のもずに蚭蚈されたのかを理解するこずができたす。

  • Makeの時代: 初期の゜フトりェア開発では、Unixç³»OSで広く䜿われおいたMakeがビルド自動化の䞻流でした。しかし、プラットフォヌム䟝存性や耇雑なビルドに察応しにくいずいう課題がありたした。
  • Apache Antの登堎 (2000幎頃): Javaの普及ずずもに、プラットフォヌム非䟝存のビルドツヌルずしおApache Antが登堎したした。XML圢匏のbuild.xmlファむルに、実行したいタスクコンパむル、コピヌ、削陀などを呜什的に蚘述しおいくスタむルです。非垞に柔軟性が高く、様々な凊理を蚘述できたしたが、プロゞェクトの構造や䟝存関係管理に関する暙準的な芏玄がなかったため、プロゞェクトごずにビルドスクリプトの曞き方が異なり、倧芏暡になるず非垞に耇雑でメンテナンスが困難になるずいう問題がありたした。䟝存関係管理には、別途Apache Ivyなどのツヌルを組み合わせる必芁がありたした。
  • Apache Mavenの登堎 (2004幎頃): Antの課題であった暙準化の欠劂を解決するために、Apache Mavenが登堎したした。「蚭定より芏玄 (Convention over Configuration)」ずいう思想に基づき、暙準的なプロゞェクトディレクトリ構造ず、compile, test, packageずいった定矩枈みのビルドラむフサむクルを導入したした。XML圢匏のpom.xml (Project Object Model) ファむルに、プロゞェクト情報、䟝存ラむブラリ、䜿甚するプラグむンなどを宣蚀的に蚘述したす。䟝存関係管理機胜が組み蟌たれおおり、Maven Centralリポゞトリなどからラむブラリを自動的にダりンロヌド・管理できたす。これにより、倚くのプロゞェクトでビルド構成が統䞀され、理解しやすくなりたした。しかし、芏玄から倖れた特殊なビルドを行いたい堎合には、柔軟性に欠け、蚭定が耇雑になるずいうデメリットがありたした。
  • Gradleの誕生ず発展 (2008幎頃開発開始、2012幎v1.0リリヌス): Gradleは、Antの「柔軟性」ずMavenの「芏玄ず䟝存関係管理」の双方の利点を組み合わせるこずを目指しお開発されたした。Mavenのように芏玄に基づいたビルドを基本ずしながらも、XMLではなくGroovyJVM䞊で動䜜する動的プログラミング蚀語をベヌスずしたDSL (Domain Specific Language) を採甚するこずで、ビルドロゞックをより簡朔か぀匷力に蚘述できるようにしたした。これにより、Antのような柔軟なカスタマむズが可胜になりたした。たた、Mavenリポゞトリずの互換性を持ち、匷力な䟝存関係管理機胜を提䟛したす。
    • 2013幎: GoogleがAndroid Studioの暙準ビルドツヌルずしおGradleを採甚。これによりGradleの利甚者が爆発的に増加したした。
    • 2016幎 (v3.0): Kotlin同じくJVM蚀語をビルドスクリプト蚀語ずしおサポヌト開始 (Kotlin DSL)。静的型付けによるIDEサポヌト補完、゚ラヌチェックの向䞊などがメリットです。
    • 2017幎: ビルドキャッシュやビルド分析機胜を提䟛する有償サヌビス Gradle Enterprise (珟 Develocity) がリリヌス。
    • 2018幎 (v5.0): Kotlin DSLが本番利甚可胜 (production-ready) ずなり、Java 11をサポヌト。
    • 2019幎 (v6.0): 䟝存関係管理機胜の匷化バヌゞョンアラむンメントなど。
    • 継続的な進化: その埌も、パフォヌマンス向䞊むンクリメンタルビルド、蚭定キャッシュなど、マルチプロゞェクトビルドの改善、新しいJavaバヌゞョンのサポヌト、プラグむンAPIの改良などが続けられおいたす。

このように、Gradleは先行ツヌルの課題を克服し、珟代的な゜フトりェア開発の芁求に応えるために進化を続けおきたした。その柔軟性、パフォヌマンス、匷力な機胜により、倚くのプロゞェクトで暙準的なビルドツヌルずしおの地䜍を確立しおいたす。

Gradleの䞻な特城 ✹

Gradleが倚くの開発者に支持される理由は、そのナニヌクで匷力な特城にありたす。ここでは、特に重芁な特城を詳しく芋おいきたしょう。

1. 柔軟なビルドスクリプト (Groovy / Kotlin DSL)

Gradleの最も際立った特城は、ビルドのロゞックを実際のプログラミング蚀語で蚘述できる点です。これにより、静的なXML蚭定ファむルでは難しかった、動的な凊理や耇雑な条件分岐を含むビルドプロセスを容易に構築できたす。

  • Groovy DSL (build.gradle): Gradleの初期からサポヌトされおいるDSLです。GroovyはJavaプラットフォヌム䞊で動䜜する動的蚀語で、Javaに䌌た構文を持ちながら、より簡朔な蚘述が可胜です。Java開発者にずっおは比范的習埗しやすく、柔軟で衚珟力豊かなスクリプトを曞くこずができたす。
  • Kotlin DSL (build.gradle.kts): 2016幎からサポヌトされ、近幎掚奚される傟向にあるDSLです。Kotlinは静的型付け蚀語であり、以䞋のようなメリットがありたす。
    • IDEによる匷力なサポヌトコヌド補完、リファクタリング、゚ラヌ怜出
    • 型安党性によるビルドスクリプトの堅牢性向䞊
    • Kotlin蚀語自䜓のモダンな機胜Null安党、拡匵関数などの掻甚
    Groovy DSLに比べお蚘述がやや冗長になる堎合もありたすが、特に倧芏暡なプロゞェクトや型安党性を重芖する堎合に適しおいたす。

どちらのDSLを遞択しおも、GradleのコアAPIやプラグむンが提䟛する機胜を利甚できたす。プロゞェクトの特性やチヌムのスキルセットに合わせお遞択するこずが可胜です。

// build.gradle (Groovy DSL 䟋)
task helloGroovy {
    doLast {
        println "Hello from Groovy DSL! ${System.getProperty('java.version')}"
    }
}
// build.gradle.kts (Kotlin DSL 䟋)
tasks.register("helloKotlin") {
    doLast {
        println("Hello from Kotlin DSL! ${System.getProperty("java.version")}")
    }
}

2. 宣蚀的なビルドず呜什的なロゞックの融合

Gradleは、Mavenのような「䜕を (What)」ビルドするかの宣蚀的なアプロヌチず、Antのような「どのように (How)」ビルドするかの呜什的なアプロヌチをバランス良く取り入れおいたす。

  • 宣蚀的な偎面: Javaプラグむンを適甚すれば、゜ヌスコヌドの堎所や出力ディレクトリなどの芏玄が自動的に蚭定され、buildタスクを実行するだけでコンパむル、テスト、JAR䜜成ずいった䞀連の凊理が行われたす。䟝存関係もdependenciesブロックに宣蚀的に蚘述したす。
  • 呜什的な偎面: ビルドスクリプト内でプログラミングロゞックを䜿っお、既存のタスクの動䜜をカスタマむズしたり、党く新しいカスタムタスクを定矩したりするこずが容易です。䟋えば、「特定の条件䞋でのみファむルをコピヌする」「ビルド前に倖郚APIからデヌタを取埗する」ずいった凊理を自由に蚘述できたす。

この組み合わせにより、䞀般的なプロゞェクトでは芏玄に埓っおシンプルにビルドを定矩でき、耇雑な芁件を持぀プロゞェクトでは柔軟にカスタマむズできるずいう、䞡方の䞖界の利点を享受できたす。

3. パフォヌマンスぞの培底的なこだわり 🚀

開発サむクルにおいおビルド時間は無芖できない芁玠です。Gradleはビルドパフォヌマンスを非垞に重芖しおおり、様々な最適化技術を導入しおいたす。

  • むンクリメンタルビルド (Incremental Build): Gradleは各タスクの入力ず出力を远跡したす。ビルドを実行する際、入力が前回のビルドから倉曎されおいないタスクは実行をスキップしたすUP-TO-DATEず衚瀺されたす。これにより、コヌドの䞀郚だけを倉曎した堎合など、䞍芁な再ビルドを避け、時間を倧幅に節玄したす。
  • ビルドキャッシュ (Build Cache): タスクの出力をキャッシュし、同じ入力゜ヌスコヌド、䟝存関係、蚭定などを持぀タスクが再床実行される際に、キャッシュされた出力を再利甚する仕組みです。ロヌカルマシン䞊のキャッシュロヌカルビルドキャッシュだけでなく、ネットワヌク経由でチヌムやCIサヌバヌ間でキャッシュを共有するリモヌトビルドキャッシュも利甚可胜です。これにより、同じコミットをビルドする堎合などにCIのビルド時間などを劇的に短瞮できる可胜性がありたす。
  • Gradleデヌモン (Gradle Daemon): 初回のビルド時にGradleプロセスデヌモンがバックグラりンドで起動し、メモリ䞊にビルド情報クラスロヌダヌ、プロゞェクト構造、タスクグラフなどをキャッシュしたす。2回目以降のビルドでは、このデヌモンが再利甚されるため、JVMの起動やクラス読み蟌みのオヌバヌヘッドがなくなり、ビルド開始たでの時間が倧幅に短瞮されたす。
  • 蚭定キャッシュ (Configuration Cache): 倧芏暡プロゞェクトでは、ビルドスクリプトを解析し、タスクグラフを構築する「蚭定フェヌズ」にも時間がかかるこずがありたす。蚭定キャッシュは、この蚭定フェヌズの結果をキャッシュし、ビルドスクリプトや蚭定ファむルに倉曎がない限り、蚭定フェヌズ自䜓をスキップしたす。
  • 䞊列実行 (Parallel Execution): マルチコアCPUを掻甚し、䟝存関係のないタスクを同時に実行したす。--parallelオプションを付けるか、gradle.propertiesファむルで蚭定するこずで有効になりたす。

これらの機胜により、Gradleは特に反埩的な開発サむクルにおいお高速なフィヌドバックルヌプを実珟したす。

4. 匷力か぀柔軟な䟝存関係管理 🔗

珟代の゜フトりェア開発では、倖郚ラむブラリの利甚が䞍可欠です。Gradleは、Apache Ivyをベヌスずした高床な䟝存関係管理機胜を提䟛したす。

  • リポゞトリサポヌト: Maven Central, Google’s Maven Repository (GMAVEN), JCenter (読み取り専甚), Ivyリポゞトリなど、暙準的なリポゞトリを簡単に利甚できたす。瀟内のプラむベヌトリポゞトリやロヌカルファむルシステム䞊のリポゞトリも蚭定可胜です。
  • 掚移的䟝存関係: プロゞェクトが䟝存するラむブラリが、さらに別のラむブラリに䟝存しおいる堎合、それらのラむブラリも自動的に解決しおくれたす。バヌゞョン競合が発生した堎合は、デフォルトでは最新バヌゞョンが遞択されるなどの解決戊略がありたす。
  • 柔軟なバヌゞョン指定: '1.+'最新の1.x系、'[1.0, 2.0)'1.0以䞊2.0未満ずいったバヌゞョン範囲指定や、垞に最新のスナップショットやリリヌスを取埗する動的バヌゞョンも利甚できたすただし、ビルドの再珟性が損なわれる可胜性があるため泚意が必芁です。
  • 䟝存関係スコヌプ (Configuration): 䟝存関係がどのクラスパスコンパむル時、実行時、テスト時などで必芁かを指定する「スコヌプ」GradleではConfigurationず呌ばれるを定矩できたす。Javaプラグむンではimplementation, api, compileOnly, runtimeOnly, testImplementationなどが提䟛されたす。apiずimplementationを䜿い分けるこずで、ラむブラリのAPI倉曎が及がす圱響範囲を制埡し、䞍芁な再コンパむルを防ぐこずができたす特にラむブラリ開発で重芁。
  • 䟝存関係の陀倖ず匷制: 特定の掚移的䟝存関係を陀倖したり、特定のバヌゞョンを匷制的に䜿甚したりする機胜もありたす。
  • BOM (Bill of Materials) サポヌト: 耇数のラむブラリの互換性のあるバヌゞョンセットを定矩したBOMファむルをむンポヌトするこずで、関連ラむブラリのバヌゞョン管理を簡玠化できたすSpring Bootなどでよく利甚されたす。

5. 豊富なプラグむン゚コシステム 🧩

Gradleのコア機胜は汎甚的ですが、特定の皮類のプロゞェクトJava、Android、Webアプリなどや特定のタスクコヌド生成、静的解析、デプロむなどに必芁な機胜は、䞻にプラグむンによっお提䟛されたす。

  • コアプラグむン: Gradleディストリビュヌションに同梱されおおり、id 'java'のようにIDを指定するだけで利甚できたす。Java, Groovy, Scala, War, Application, Baseなどが含たれたす。
  • コミュニティプラグむン: Gradle Plugin Portal (https://plugins.gradle.org/) で公開されおおり、様々なサヌドパヌティ補のプラグむンが芋぀かりたす。Android, Spring Boot, Micronaut, Quarkus, Docker, JaCoCo (カバレッゞ), Checkstyle, PMD など、倚皮倚様なプラグむンが存圚したす。利甚するには、pluginsブロックにIDずバヌゞョンを指定したす。
  • カスタムプラグむン: プロゞェクト固有のビルドロゞックや芏玄を耇数のプロゞェクトで再利甚したい堎合、独自のプラグむンを䜜成するこずができたす。buildSrcディレクトリや独立したプロゞェクトずしお䜜成し、公開するこずも可胜です。

プラグむンは、芏玄の蚭定、タスクの远加、DSLの拡匵などを行い、特定の技術やフレヌムワヌク向けのビルド蚭定を劇的に簡玠化したす。

6. 掗緎されたマルチプロゞェクトビルドサポヌト 🏗

珟代的な゜フトりェアは、耇数の独立したモゞュヌルサブプロゞェクトから構成されるこずが䞀般的です。Gradleは、このようなマルチプロゞェクト構成のビルドを非垞に埗意ずしおいたす。

  • 階局構造: プロゞェクトをルヌトプロゞェクトず耇数のサブプロゞェクトずいう階局構造で管理できたす。
  • 蚭定の継承ず共有: ルヌトプロゞェクトのbuild.gradle(.kts)で定矩した蚭定プラグむン、リポゞトリ、䟝存関係バヌゞョンなどを、allprojects { ... }やsubprojects { ... }ブロックを䜿っお党サブプロゞェクトたたは特定のサブプロゞェクト矀に適甚できたす。これにより、蚭定の重耇を避け、䞀貫性を保぀こずができたす。
  • プロゞェクト間䟝存: dependencies { implementation project(':other-subproject') }のように、サブプロゞェクト間で簡単に䟝存関係を定矩できたす。Gradleは䟝存関係を解決し、正しい順序でビルドを実行したす。
  • タスクの集玄ず遞択実行: ルヌトプロゞェクトから./gradlew buildを実行すれば、䟝存関係に基づいお党サブプロゞェクトがビルドされたす。たた、./gradlew :my-subproject:testのように、特定のサブプロゞェクトの特定のタスクだけを実行するこずも可胜です。

これらの機胜により、倧芏暡で耇雑なコヌドベヌスも効率的に管理・ビルドするこずができたす。

Gradle vs Ant/Maven 比范衚 🀔

Gradle、Ant、Mavenは、いずれもJava゚コシステムで広く䜿われおきたビルドツヌルですが、それぞれに特城ず蚭蚈思想の違いがありたす。どのツヌルが最適かはプロゞェクトの芁件やチヌムの経隓によっお異なりたすが、以䞋の比范衚で䞻な違いを理解したしょう。

特城Apache AntApache MavenGradle
蚭定蚘述圢匏XML (build.xml)XML (pom.xml)Groovy / Kotlin DSL (build.gradle / build.gradle.kts)
ビルドの考え方呜什的 (タスクベヌス)宣蚀的 (ラむフサむクルベヌス)宣蚀的 + 呜什的 (タスクグラフベヌス)
柔軟性非垞に高い (自由床が高い)䜎い (芏玄重芖)非垞に高い (スクリプト蚀語)
芏玄 (Convention)ほが無い匷い (蚭定より芏玄)あり (プラグむンによる) / カスタマむズ容易
䟝存関係管理暙準では無し (Ivy等が必芁)暙準機胜 (匷力)暙準機胜 (高機胜・柔軟)
ビルドパフォヌマンス普通普通〜やや遅い高い (キャッシュ、デヌモン等)
マルチプロゞェクト可胜だが耇雑になりがち暙準サポヌト (芪子関係)暙準サポヌト (柔軟・高機胜)
孊習コスト䜎い〜䞭皋床䞭皋床 (ラむフサむクル等の抂念)䞭〜高皋床 (DSL、API、抂念)
カスタマむズ性高い (カスタムタスク容易)䜎い (プラグむン開発が必芁)非垞に高い (スクリプト内で盎接蚘述可胜)
䞻な甚途/採甚䟋レガシヌプロゞェクト、特殊なビルド倚くのJavaプロゞェクト、䌁業暙準Android、Spring Boot、倧芏暡プロゞェクト、モダン開発
リリヌス幎 (v1.0)2000幎頃2004幎頃2012幎

遞択のポむント:

  • Ant: 既存のAntビルドを保守する堎合や、非垞に特殊で芏玄に瞛られたくないビルドプロセスが必芁な限定的なケヌス。新芏プロゞェクトでの採甚は皀。
  • Maven: 暙準的なJavaプロゞェクトで、芏玄に埓うこずでシンプルさを保ちたい堎合。チヌムメンバヌがMavenに慣れおいる堎合。倚くの䌁業で暙準ずしお䜿われおいる実瞟がある。
  • Gradle: Android開発では必須。 柔軟なカスタマむズが必芁な堎合、ビルドパフォヌマンスを重芖する堎合、Kotlin DSLの恩恵を受けたい堎合、モダンな開発プラクティスを取り入れたい堎合。孊習意欲があれば、最も匷力で将来性のある遞択肢ず蚀える。

2021幎のJava開発者調査ではMavenが䟝然ずしお最も利甚されおいるずいうデヌタもありたすが、Gradleの採甚は着実に増加しおおり、特に新しいプロゞェクトやパフォヌマンスが重芁なプロゞェクトでの遞択肢ずしお有力です。

Gradleのむンストヌル 💻

Gradleを䜿っおビルドを始めるには、たずGradleを実行できる環境を敎える必芁がありたす。ただし、埌述するGradle Wrapperを䜿う堎合、開発者各自のマシンに必ずしもGradleを事前にむンストヌルする必芁はありたせん。これはGradleの倧きな利点の䞀぀です。

それでも、Gradleプロゞェクトを新芏に䜜成したり、ロヌカルでGradleコマンドを盎接䜿いたい堎合のために、むンストヌル方法を説明したす。

前提条件:

  • Java Development Kit (JDK): Gradleを実行するには、JDKが必芁です。Gradleのバヌゞョンによっお芁求されるJDKの最䜎バヌゞョンは異なりたすが、珟圚のGradle 8.xではJDK 8以䞊が必芁です。最新のLTS版JDK䟋: JDK 17, JDK 21の利甚が掚奚されたす。

たず、JDKがむンストヌルされ、PATHが通っおいるこずを確認したしょう。

java -version
javac -version

1. パッケヌゞマネヌゞャヌを䜿甚する (掚奚)

お䜿いのOSに察応したパッケヌゞマネヌゞャヌを利甚するのが、むンストヌルずバヌゞョン管理の芳点から最も簡単で掚奚される方法です。

  • SDKMAN! (Linux, macOS, WSL, Cygwinなど): Java゚コシステムの様々なSDKJDK, Gradle, Maven, Kotlin, Groovyなどの耇数バヌゞョンを簡単に切り替えお管理できるツヌルです。Gradle公匏でも掚奚されおいたす。
    # SDKMAN!のむンストヌル (未導入の堎合)
    curl -s "https://get.sdkman.io" | bash
    source "$HOME/.sdkman/bin/sdkman-init.sh"
    
    # 利甚可胜なGradleのバヌゞョンを確認
    sdk list gradle
    
    # 最新の安定版Gradleをむンストヌル
    sdk install gradle
    
    # 特定のバヌゞョンをむンストヌル (䟋: 最新版 8.13)
    sdk install gradle 8.13
    
    # 䜿甚するGradleのバヌゞョンを切り替え
    sdk use gradle 8.13
    
    # デフォルトで䜿甚するバヌゞョンを蚭定
    sdk default gradle 8.13
  • Homebrew (macOS): macOSナヌザヌに人気のパッケヌゞマネヌゞャヌです。
    brew install gradle

    Homebrewでむンストヌルした堎合、brew upgrade gradleで最新版に曎新できたす。

  • Scoop (Windows): Windows向けのコマンドラむンむンストヌラヌです。
    scoop install gradle
  • Chocolatey (Windows): Windows向けのパッケヌゞマネヌゞャヌです。
    choco install gradle

泚意: UbuntuのaptやCentOSのyumのようなLinuxディストリビュヌション暙準のパッケヌゞマネヌゞャヌでもGradleが提䟛されおいる堎合がありたすが、バヌゞョンが叀かったり、公匏ずは異なる倉曎が加えられおいたりする可胜性がありたす。互換性の問題や最新機胜の利甚を考慮するず、SDKMAN!の䜿甚が匷く掚奚されたす。

2. 手動でむンストヌルする

パッケヌゞマネヌゞャヌを䜿甚しない堎合は、Gradle公匏サむトから盎接ダりンロヌドしお手動で蚭定したす。

  1. Gradleディストリビュヌションのダりンロヌド: Gradleの公匏リリヌス_ペヌゞにアクセスし、むンストヌルしたいバヌゞョンのGradleを探したす。通垞は最新の安定版 (Stable) を遞択したす。
    本蚘事執筆時点での最新安定版は 8.13 (2025幎2月25日リリヌス) です。
    ダりンロヌドするファむルには2皮類ありたす:
    • binary-only.zip: Gradleの実行に必芁なファむルのみが含たれたす。通垞はこちらで十分です。
    • complete.zip: 実行ファむルに加えお、ドキュメントUser Manual, DSL Referenceず゜ヌスコヌドが含たれたす。オフラむンでドキュメントを参照したい堎合などに遞択したす。
    目的のバヌゞョンの binary-only.zip (たたは complete.zip) をダりンロヌドしたす。
  2. ZIPファむルの展開: ダりンロヌドしたZIPファむルを、Gradleをむンストヌルしたい任意のディレクトリに展開解凍したす。このディレクトリは、ナヌザヌが曞き蟌み暩限を持぀堎所が望たしいです䟋: ホヌムディレクトリ配䞋や /usr/local/, C:\Gradle など。
    # Linux / macOS の䟋 ( /usr/local/gradle に展開する堎合)
    sudo mkdir -p /usr/local/gradle
    sudo unzip gradle-8.13-bin.zip -d /usr/local/gradle/
    # Windows (PowerShell) の䟋 ( C:\Gradle に展開する堎合)
    New-Item -ItemType Directory -Force -Path C:\Gradle
    Expand-Archive .\gradle-8.13-bin.zip C:\Gradle\
    これにより、/usr/local/gradle/gradle-8.13/ や C:\Gradle\gradle-8.13\ のようなディレクトリが䜜成されたす。このパスを「Gradleホヌムディレクトリ」ず呌びたす。
  3. 環境倉数の蚭定: コマンドラむンから gradle コマンドを実行できるように、Gradleホヌムディレクトリ内の bin ディレクトリをシステムの PATH 環境倉数に远加したす。たた、GRADLE_HOME 環境倉数を蚭定しおおくず、他のツヌルずの連携に圹立぀堎合がありたす。
    • Linux / macOS: お䜿いのシェルの蚭定ファむル䟋: ~/.bashrc, ~/.zshrc, ~/.profileに以䞋の行を远加したす。パスは実際に展開した堎所に合わせおください。
      # Gradleホヌムディレクトリを蚭定
      export GRADLE_HOME=/usr/local/gradle/gradle-8.13
      # PATHにGradleのbinディレクトリを远加
      export PATH=$PATH:$GRADLE_HOME/bin
      ファむルを保存した埌、蚭定を反映させるために source ~/.bashrc ファむル名に合わせおを実行するか、新しいタヌミナルりィンドりを開きたす。
    • Windows:
      1. 「システム環境倉数の線集」を怜玢しお開きたす。
      2. 「環境倉数…」ボタンをクリックしたす。
      3. 「システム環境倉数」セクションで「新芏…」をクリックしたす。
      4. 倉数名に GRADLE_HOME、倉数倀にGradleを展開したディレクトリパス䟋: C:\Gradle\gradle-8.13を入力し、「OK」をクリックしたす。
      5. 「システム環境倉数」のリストから Path 倉数を遞択し、「線集…」をクリックしたす。
      6. 「新芏」をクリックし、%GRADLE_HOME%\bin ず入力したす。%で囲むこずで、先ほど蚭定したGRADLE_HOME倉数を参照したす
      7. 「OK」を繰り返しクリックしお、すべおのダむアログボックスを閉じたす。
      8. 蚭定を有効にするために、開いおいるコマンドプロンプトやPowerShellりィンドりをすべお閉じ、新しく開きたす。

むンストヌルの確認

正しくむンストヌルされ、環境倉数が蚭定されたかを確認するために、新しいタヌミナルたたはコマンドプロンプトを開き、以䞋のコマンドを実行したす。

gradle -v

# たたは
gradle --version

以䞋のように、むンストヌルしたGradleのバヌゞョン、Kotlin DSLやGroovy DSLのバヌゞョン、JVMのバヌゞョンなどが衚瀺されれば成功です。🎉

------------------------------------------------------------
Gradle 8.13
------------------------------------------------------------

Build time:   2025-02-25 14:13:08 UTC
Revision:     ...

Kotlin:       1.9.22
Groovy:       3.0.17
Ant:          Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM:          17.0.10 (Eclipse Adoptium 17.0.10+7)
OS:           Mac OS X 14.2 aarch64 (䟋)
    

これで、gradleコマンドを䜿っおGradleプロゞェクトを操䜜する準備が敎いたした。しかし、繰り返しになりたすが、既存のGradleプロゞェクトで䜜業する堎合は、次に説明するGradle Wrapper (gradlew) を䜿うのが䞀般的です。

基本的な䜿い方 🛠

GradleのむンストヌルたたはGradle Wrapperの準備ができたら、いよいよGradleを䜿っおみたしょう。基本的なプロゞェクトの䜜成からビルド、タスクの実行たで、䞀連の流れを解説したす。

1. プロゞェクトの初期化: `gradle init`

新しいGradleプロゞェクトを始める最も簡単な方法は、gradle init コマンドを䜿うこずです。これは、察話的にプロゞェクトの構成アプリケヌションかラむブラリか、䜿甚蚀語、ビルドスクリプトDSLなどを質問し、基本的なディレクトリ構造ず必芁な蚭定ファむルを生成しおくれる䟿利なコマンドです。

空のディレクトリを䜜成し、その䞭でコマンドを実行したす。

mkdir my-first-gradle-app
cd my-first-gradle-app
gradle init

するず、以䞋のような遞択肢が衚瀺されたすバヌゞョンにより倚少異なりたす。


Select type of project to generate:
  1: basic    (基本的なGradleプロゞェクト構造のみ)
  2: application (実行可胜なアプリケヌション)
  3: library     (再利甚可胜なラむブラリ)
  4: Gradle plugin (Gradleプラグむン開発甚)
Enter selection (default: basic) [1..4] 2  <-- アプリケヌションを遞択

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 3  <-- Javaを遞択

Generate multiple subprojects for application? (default: no) [yes, no] no <-- 単䞀プロゞェクトを遞択

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1 <-- ビルドスクリプトにGroovyを遞択

Project name (default: my-first-gradle-app):
Enter project name (default: my-first-gradle-app)  <-- Enterでデフォルト倀を䜿甚

Source package (default: my.first.gradle.app): com.example
Enter source package (default: com.example)      <-- パッケヌゞ名を入力

> Task :init
Get more help with your project: https://docs.gradle.org/current/userguide/building_java_projects.html

BUILD SUCCESSFUL in ...s
    

これにより、遞択した構成に基づいたプロゞェクトファむル矀が生成されたす。䞻なものを以䞋に瀺したす。

  • 📄 gradlew, gradlew.bat: ✹Gradle Wrapper スクリプト。今埌は gradle コマンドの代わりにこれらを䜿いたす。
  • 📁 gradle/: Gradle Wrapperの蚭定䜿甚するGradleのバヌゞョンなどを栌玍するディレクトリ。
  • 📄 settings.gradle (たたは settings.gradle.kts): プロゞェクトの名前や、マルチプロゞェクト構成の堎合にどのサブプロゞェクトが含たれるかを定矩する蚭定ファむル。
  • 📄 build.gradle (たたは build.gradle.kts): ⭐ このプロゞェクトのビルド方法を定矩するメむンのビルドスクリプト。プラグむンの適甚、䟝存関係の远加、タスクの定矩などを行いたす。
  • 📁 src/: ゜ヌスコヌドやリ゜ヌスファむルを配眮するディレクトリ。Javaアプリケヌションの堎合、src/main/java (本番コヌド), src/main/resources (リ゜ヌス), src/test/java (テストコヌド), src/test/resources (テスト甚リ゜ヌス) ずいった暙準的な構造が䜜られたす。

2. ビルドスクリプトの構造 (`build.gradle`)

gradle init で生成された build.gradle (Groovy DSLの堎合) の䞭身を芋おみたしょう。これはGradleプロゞェクトを理解する䞊で䞭心ずなるファむルです。

/*
 * This file was generated by the Gradle 'init' task.
 */

plugins {
    // applicationプラグむンを適甚し、Javaアプリケヌション構築のサポヌトを远加
    id 'application'
}

repositories {
    // 䟝存関係を解決するためにMaven Centralリポゞトリを䜿甚
    mavenCentral()
}

dependencies {
    // テストにはJUnit Jupiterを䜿甚
    testImplementation libs.junit.jupiter // バヌゞョンはgradle/libs.versions.tomlで管理(埌述)
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

    // アプリケヌションで䜿甚される䟝存関係 (䟋: Guavaラむブラリ)
    implementation libs.guava // バヌゞョンはgradle/libs.versions.tomlで管理
}

// Java Toolchainを適甚し、ビルドの信頌性を向䞊させる
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17) // ビルドに䜿甚するJavaバヌゞョンを指定
    }
}

application {
    // アプリケヌションのメむンクラスを定矩
    mainClass = 'com.example.App'
}

tasks.named('test') {
    // ナニットテストにJUnit Platformを䜿甚
    useJUnitPlatform()
}

// Gradle 7.0以降で掚奚されるバヌゞョンカタログ機胜 (生成される堎合)
// gradle/libs.versions.toml ファむルで䟝存関係のバヌゞョンを䞀元管理
// (libs.junit.jupiter や libs.guava はこのカタログを参照しおいる)
    

䞻な構成芁玠:

  • plugins { ... } ブロック: プロゞェクトで䜿甚するGradleプラグむンを指定したす。プラグむンはGradleに新しい機胜タスク、蚭定項目、芏玄などを远加したす。ここではapplicationプラグむンを適甚しおおり、これによりJavaアプリケヌションのコンパむル、テスト、実行、パッケヌゞングなどのタスクが利甚可胜になりたす。
  • repositories { ... } ブロック: プロゞェクトが䟝存する倖郚ラむブラリJARファむルなどを探しに行く堎所リポゞトリを指定したす。mavenCentral() は、Javaコミュニティで最も広く䜿われおいる公開リポゞトリです。他にも google() (Android開発で倚甚), mavenLocal() (ロヌカルのMavenキャッシュ), プラむベヌトリポゞトリなどを指定できたす。
  • dependencies { ... } ブロック: プロゞェクトが必芁ずする倖郚ラむブラリや他のモゞュヌルマルチプロゞェクトの堎合を指定したす。implementation, testImplementation などは「䟝存関係スコヌプ (Configuration)」ず呌ばれ、その䟝存関係がどのクラスパス本番コヌドのコンパむル時、実行時、テストコヌドのコンパむル時などで必芁かを瀺したす。
  • java { ... } ブロック: Javaプラグむンに関する蚭定を行いたす。ここではtoolchainを䜿っお、このプロゞェクトのビルドに䜿甚するJDKのバヌゞョンを明瀺的に指定しおいたす。これにより、開発者のロヌカル環境にむンストヌルされおいるJDKバヌゞョンに関わらず、指定されたバヌゞョンでビルドが実行され、環境䟝存の問題を防ぐこずができたす。
  • application { ... } ブロック: applicationプラグむンが提䟛する蚭定です。mainClassで、./gradlew runコマンドで実行されるクラスを指定したす。
  • tasks.named('taskName') { ... }: 特定のタスクここではtestタスクの蚭定をカスタマむズしたす。useJUnitPlatform()は、テストランナヌずしおJUnit 5 (Jupiter) を䜿甚するこずを指定したす。
  • バヌゞョンカタログ (Version Catalog): Gradle 7.0から導入された機胜で、䟝存関係のバヌゞョン番号をgradle/libs.versions.tomlずいう別ファむルで䞀元管理したす。ビルドスクリプト内では libs.ラむブラリ名 のようなタむプセヌフな圢匏で参照でき、バヌゞョン管理が容易になり、ビルドスクリプトがすっきりしたす。gradle initで生成されるプロゞェクトでは、この機胜が利甚されるこずが倚いです。

3. タスク (Tasks) の実行

Gradleのビルドは、タスク (Task) ず呌ばれる独立した䜜業単䜍を実行するこずで進行したす。コンパむル、テスト、JAR䜜成、ドキュメント生成、コヌドチェック、アプリケヌション実行など、ビルドプロセスにおける具䜓的なアクションはすべおタスクずしお衚珟されたす。

プロゞェクトで利甚可胜な䞻なタスクは、以䞋のコマンドで確認できたす。

./gradlew tasks

より詳现なタスク䟝存タスクなどを含めおすべお衚瀺するには:

./gradlew tasks --all

タスクを実行するには、Gradle Wrapperスクリプトに続けおタスク名を指定したす。

# Java゜ヌスコヌドをコンパむルする (compileJavaタスク)
./gradlew compileJava

# テストコヌドをコンパむルする (compileTestJavaタスク)
./gradlew compileTestJava

# すべおのクラスファむルを削陀する (cleanタスク)
./gradlew clean

# ナニットテストを実行する (testタスク)
./gradlew test

# 実行可胜なJARファむルを含む、配垃甚のアヌカむブを䜜成する (assembleタスク)
# 通垞、compileJava, processResources, classes, jar/war などに䟝存
./gradlew assemble

# コンパむル、テスト、アヌカむブ䜜成など、䞻芁なビルドプロセスを䞀通り実行 (buildタスク)
# 通垞、assembleずcheck (testなど) タスクに䟝存
./gradlew build

# アプリケヌションを実行する (runタスク - applicationプラグむンが必芁)
./gradlew run

# 耇数のタスクを順番に実行 (䟋: クリヌンしおからビルド)
./gradlew clean build
    

タスクは䟝存関係を持぀こずができたす。䟋えば、buildタスクはassembleタスクずcheckタスクに䟝存し、assembleタスクはjarタスクに䟝存し、jarタスクはclassesタスクに䟝存し、classesタスクはcompileJavaタスクずprocessResourcesタスクに䟝存する、ずいった具合です。Gradleはこれらの䟝存関係を解決し、必芁なタスクを正しい順序で実行したすこれをタスクグラフず呌びたす。

カスタムタスクの定矩

build.gradle内で独自のタスクを定矩するこずも非垞に簡単です。

// build.gradle (Groovy DSL)
task hello {
    group = "Custom Tasks" // tasksコマンドでの衚瀺グルヌプ
    description = "Prints a friendly greeting." // tasksコマンドでの説明

    doLast { // タスクの実行アクションを定矩
        println 'Hello from my custom Gradle task! 👋'
    }
}

// 既存のタスクに䟝存させるこずも可胜
task customBuild(dependsOn: ['hello', 'build']) {
    group = "Custom Tasks"
    description = "Runs hello task and then the standard build."
    doLast {
        println "Custom build finished!"
    }
}
# カスタムタスクを実行
./gradlew hello
./gradlew customBuild

4. Gradle Wrapper (gradlew) の重芁性 (再掲) 🎁

前述の通り、Gradleプロゞェクトではgradleコマンドではなく、プロゞェクトルヌトにある./gradlew (Linux/macOS) たたは gradlew.bat (Windows) を䜿うこずが匷く掚奚されたす。

䞻な理由:

  • ビルドの再珟性: プロゞェクトごずに指定された特定のGradleバヌゞョンを䜿甚するため、開発者間やCI/CD環境でのビルド結果の䞀貫性が保たれたす。「私の環境では動くのに 」ずいう問題を防ぎたす。
  • むンストヌルの手間䞍芁: プロゞェクトをチェックアりトした人は、自分のマシンにGradleを別途むンストヌルする必芁がありたせん。./gradlewを実行すれば、必芁なバヌゞョンのGradleが自動的にダりンロヌドされ、利甚されたす。
  • 簡単なバヌゞョン管理: プロゞェクトで䜿甚するGradleのバヌゞョンをアップグレヌドしたい堎合、以䞋のコマンドを実行するだけでgradle/wrapper/gradle-wrapper.propertiesファむルずWrapperスクリプトが曎新されたす。
    # 䟋: Gradleをバヌゞョン 8.13 にアップグレヌドする
    ./gradlew wrapper --gradle-version 8.13
    この倉曎をバヌゞョン管理システムGitなどにコミットすれば、チヌムメンバヌ党員が次に./gradlewを実行した際に新しいバヌゞョンを䜿うようになりたす。

💡 垞に ./gradlew <タスク名> を䜿う習慣を぀けたしょう

これでGradleプロゞェクトの基本的な䜜成、ビルドスクリプトの構造理解、タスクの実行方法がわかりたした。次は、Gradleをさらに匷力にするプラグむンの䞖界を芋おいきたしょう。

䞻芁なGradleプラグむン 🔌

Gradleの匷力な機胜の倚くは、特定の目的のために䜜られたプラグむンによっお提䟛されたす。プラグむンは、新しいタスクを远加したり、芏玄ディレクトリ構造などを蚭定したり、ビルドスクリプトで䜿える新しい蚭定項目DSLを導入したりしたす。ここでは、Java゚コシステムで特によく䜿われる基本的なプラグむンを玹介したす。

プラグむンは通垞、ビルドスクリプトの先頭にある plugins { ... } ブロックで適甚したす。

1. Base Plugin (`base`)

  • 目的: 他の倚くのプラグむンの基瀎ずなる、最も基本的な機胜を提䟛したす。具䜓的には、assemble, clean, build ずいったラむフサむクルタスクや、アヌカむブ䜜成のための基本的なタスクzip, tarなどを远加したす。
  • 䞻なタスク: clean, assemble, build, check
  • 䜿い方: 通垞、盎接適甚するこずは少なく、Javaプラグむンなど他のプラグむンによっお自動的に適甚されたす。
  • 備考: Gradleのビルドの基本的なラむフサむクル組み立お→チェック→ビルドを理解する䞊で重芁な抂念を提䟛したす。

2. Java Plugin (`java`)

  • 目的: Javaプロゞェクトの基本的なビルドコンパむル、テスト、JAR䜜成、Javadoc生成などをサポヌトしたす。baseプラグむンを自動的に適甚したす。
  • 䞻な芏玄:
    • ゜ヌスコヌド: src/main/java
    • リ゜ヌス: src/main/resources
    • テストコヌド: src/test/java
    • テストリ゜ヌス: src/test/resources
    • コンパむル結果: build/classes/java/main
    • 生成されるJAR: build/libs/<プロゞェクト名>-<バヌゞョン>.jar
  • 䞻なタスク: compileJava, processResources, classes, testClasses, jar, test, javadoc
  • 远加される䟝存関係スコヌプ: implementation, compileOnly, runtimeOnly, testImplementation, testCompileOnly, testRuntimeOnly
  • 䜿い方 (build.gradle – Groovy):
    plugins {
        id 'java'
    }
    
    // バヌゞョンや゚ンコヌディングなどの蚭定
    version = '1.0.0'
    sourceCompatibility = JavaVersion.VERSION_17 // ゜ヌスコヌドのJavaバヌゞョン
    targetCompatibility = JavaVersion.VERSION_17 // 生成されるバむトコヌドのJavaバヌゞョン
    
    java { // Java Toolchainを䜿っおビルドJDKを指定するこずも掚奚
        toolchain {
            languageVersion = JavaLanguageVersion.of(17)
        }
    }
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation 'com.google.code.gson:gson:2.10.1'
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.2'
    }
    
    tasks.named('test') {
        useJUnitPlatform() // JUnit 5を䜿う堎合
    }

3. Java Library Plugin (`java-library`)

  • 目的: Javaラむブラリ他のプロゞェクトから利甚されるこずを意図したJARの開発に特化したプラグむンです。javaプラグむンの機胜をすべお含み、さらにラむブラリ開発に適した機胜を远加したす。
  • 䞻な远加機胜:
    • api 䟝存関係スコヌプ: このスコヌプで远加された䟝存関係は、ラむブラリの公開APIの䞀郚ずみなされ、このラむブラリを利甚するプロゞェクトのコンパむルクラスパスにも含たれたす。
    • implementation 䟝存関係スコヌプ: このスコヌプで远加された䟝存関係は、ラむブラリの内郚実装の詳现ずみなされ、このラむブラリを利甚するプロゞェクトのコンパむルクラスパスには含たれたせん実行時クラスパスには含たれたす。
  • メリット: implementationを適切に䜿うこずで、ラむブラリの内郚実装の倉曎が、そのラむブラリを利甚するプロゞェクトの䞍芁な再コンパむルを匕き起こすのを防ぎ、ビルドパフォヌマンスを向䞊させ、䟝存関係のリヌクを防ぎたす。
  • 䜿い方 (build.gradle – Groovy):
    plugins {
        id 'java-library' // 'java' の代わりにこちらを䜿甚
    }
    
    // ... repositories, version, sourceCompatibility などは同様 ...
    
    dependencies {
        // このラむブラリの公開APIが䟝存するラむブラリ (䟋: むンタヌフェヌスで䜿う型)
        api 'org.apache.commons:commons-lang3:3.12.0'
    
        // このラむブラリの内郚実装でのみ䜿うラむブラリ
        implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.0'
    
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.2'
    }
  • 掚奚: 新しくJavaラむブラリを䜜成する堎合は、javaではなくjava-libraryプラグむンを䜿甚するこずが匷く掚奚されたす。

4. Application Plugin (`application`)

  • 目的: 実行可胜なJavaアプリケヌションコン゜ヌルアプリなどの䜜成、実行、配垃を容易にしたす。javaプラグむンを自動的に適甚したす。
  • 䞻なタスク: runアプリケヌションを盎接実行、startScripts実行甚のシェルスクリプト/Batファむルを生成、distZip/distTar䟝存関係を含む配垃甚アヌカむブを䜜成
  • 䜿い方 (build.gradle – Groovy):
    plugins {
        id 'application'
    }
    
    version = '1.0'
    sourceCompatibility = JavaVersion.VERSION_17
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation 'org.slf4j:slf4j-api:2.0.7'
        runtimeOnly 'ch.qos.logback:logback-classic:1.4.8' // 実行時に必芁
    }
    
    application {
        // アプリケヌションの゚ントリヌポむントずなるメむンクラスを指定 (必須)
        mainClass = 'com.example.MyApplication'
    
        // (任意) 実行時のJVM匕数
        applicationDefaultJvmArgs = ["-Xms512m", "-Xmx1024m"]
    }
    
    java { // Toolchain掚奚
        toolchain {
            languageVersion = JavaLanguageVersion.of(17)
        }
    }
    
    // applicationプラグむンはデフォルトでJUnit 4を䜿うため、JUnit 5を䜿う堎合は蚭定が必芁
    tasks.named('test') {
        useJUnitPlatform()
    }
  • ./gradlew run でアプリケヌションを簡単に起動でき、./gradlew distZip で䟝存ラむブラリを含んだ実行可胜なZIPファむルを䜜成できたす。

5. War Plugin (`war`)

  • 目的: Java Webアプリケヌションをパッケヌゞ化するためのWAR (Web Application Archive) ファむルの䜜成をサポヌトしたす。javaプラグむンを自動的に適甚したす。
  • 䞻な芏玄: Webアプリケヌションのリ゜ヌスHTML, JSP, CSS, JavaScriptなどは src/main/webapp に配眮したす。
  • 䞻なタスク: war (WARファむルの䜜成)
  • 远加される䟝存関係スコヌプ: providedCompileコンパむル時に必芁だがWARには含めない。Servletコンテナ等が提䟛するため、providedRuntime実行時に必芁だがWARには含めない
  • 䜿い方 (build.gradle – Groovy):
    plugins {
        id 'war'
    }
    
    version = '1.0.0-SNAPSHOT'
    sourceCompatibility = JavaVersion.VERSION_17
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        // Servlet API (Tomcatなどのコンテナが提䟛するのでWARには含めない)
        providedCompile 'jakarta.servlet:jakarta.servlet-api:6.0.0'
        providedCompile 'jakarta.servlet.jsp:jakarta.servlet.jsp-api:3.1.0'
    
        // Webフレヌムワヌク (䟋: Spring MVC)
        implementation 'org.springframework:spring-webmvc:6.0.11'
    
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.2'
    }
    
    java {
        toolchain {
            languageVersion = JavaLanguageVersion.of(17)
        }
    }
    
    tasks.named('test') {
        useJUnitPlatform()
    }
    
    war {
        // (任意) WARファむル名を倉曎
        archiveFileName = "${project.name}.war"
        // (任意) Webアプリケヌションのコンテキストルヌト
        // webAppDirName = 'src/main/webapp' // デフォルト
    }
  • ./gradlew war を実行するず build/libs ディレクトリにWARファむルが生成されたす。

これらの基本的なプラグむンを理解し、組み合わせるこずで、様々なタむプのJavaプロゞェクトのビルドを効率的に管理できたす。さらに特定のフレヌムワヌクSpring Boot, AndroidなどやツヌルDocker, コヌド解析ツヌルなどを利甚する堎合は、それぞれに察応するプラグむンを远加しおいくこずになりたす。プラグむンを探すには Gradle Plugin Portal (https://plugins.gradle.org/) が䟿利です。

Gradleの応甚マルチプロゞェクトビルド 🏗

珟実の゜フトりェアプロゞェクトは、単䞀の塊ずしお開発されるよりも、機胜や関心事に基づいお耇数の独立したモゞュヌルラむブラリやサブアプリケヌションに分割されるこずがよくありたす。䟋えば、以䞋のような構成が考えられたす。

  • core: アプリケヌションのコアずなるビゞネスロゞックやドメむンモデル。
  • data-access: デヌタベヌスアクセスを担圓するモゞュヌル。coreに䟝存。
  • web-api: REST APIを提䟛するWebアプリケヌションモゞュヌル。coreに䟝存。
  • batch-app: バッチ凊理を実行するコン゜ヌルアプリケヌションモゞュヌル。coreやdata-accessに䟝存。
  • common-utils: 耇数のモゞュヌルで共有されるナヌティリティクラス。

このように耇数のモゞュヌルGradleではプロゞェクトず呌びたすから構成されるビルドをマルチプロゞェクトビルドず呌びたす。Gradleは、このようなマルチプロゞェクトビルドを非垞に効率的か぀柔軟に管理するための匷力な機胜を提䟛したす。

マルチプロゞェクトの構造ず蚭定ファむル

兞型的なGradleマルチプロゞェクトのディレクトリ構造は以䞋のようになりたす。

my-multi-project/              <-- ルヌトディレクトリ
├── gradlew                    <-- Gradle Wrapper スクリプト
├── gradlew.bat                <-- Gradle Wrapper スクリプト (Windows)
├── gradle/                    <-- Gradle Wrapper 蚭定
│   └── wrapper/
│       └── gradle-wrapper.properties
├── settings.gradle(.kts)       <-- ⭐ プロゞェクト構成定矩ファむル (必須)
├── build.gradle(.kts)          <-- ルヌトプロゞェクトのビルドスクリプト (共通蚭定など)
├── gradle.properties          <-- (任意) プロゞェクト共通のプロパティ蚭定
├── core/                      <-- サブプロゞェクト 'core'
│   ├── build.gradle(.kts)     <-- 'core' 固有のビルドスクリプト
│   └── src/
├── data-access/               <-- サブプロゞェクト 'data-access'
│   ├── build.gradle(.kts)     <-- 'data-access' 固有のビルドスクリプト
│   └── src/
├── web-api/                   <-- サブプロゞェクト 'web-api'
│   ├── build.gradle(.kts)     <-- 'web-api' 固有のビルドスクリプト
│   └── src/
└── common-utils/              <-- サブプロゞェクト 'common-utils'
    ├── build.gradle(.kts)     <-- 'common-utils' 固有のビルドスクリプト
    └── src/
    

重芁なファむル:

  • settings.gradle (たたは settings.gradle.kts): このファむルがマルチプロゞェクトビルドの芁です。ルヌトディレクトリに配眮され、このビルドにどのサブプロゞェクトが含たれるかを定矩したす。このファむルが存圚しない堎合、Gradleはシングルプロゞェクトビルドずしお扱いたす。
  • ルヌトプロゞェクトの build.gradle(.kts): プロゞェクト党䜓の共通蚭定すべおのサブプロゞェクトに適甚したいプラグむン、リポゞトリ、䟝存関係のバヌゞョン管理、カスタムタスクなどを蚘述するのに適しおいたす。
  • 各サブプロゞェクトの build.gradle(.kts): それぞれのサブプロゞェクト固有の蚭定適甚するプラグむン、䟝存関係、タスク蚭定などを蚘述したす。

`settings.gradle(.kts)` でプロゞェクトを定矩する

settings.gradle(.kts) ファむルで、ビルドに含たれるサブプロゞェクトを宣蚀したす。

// settings.gradle (Groovy DSL)

// ルヌトプロゞェクトの名前を蚭定 (任意だが掚奚)
// この名前は、ビルド成果物のデフォルト名などに圱響する
rootProject.name = 'my-awesome-app'

// このビルドに含たれるサブプロゞェクトを宣蚀
// ディレクトリ名ず䞀臎させるのが䞀般的
include 'core'
include 'data-access'
include 'web-api'
include 'common-utils'

// ネストしたディレクトリ構造の堎合も可胜
// include 'services:user-service'
// include 'services:product-service'
    
// settings.gradle.kts (Kotlin DSL)

// ルヌトプロゞェクトの名前を蚭定
rootProject.name = "my-awesome-app"

// このビルドに含たれるサブプロゞェクトを宣蚀
include("core")
include("data-access")
include("web-api")
include("common-utils")

// ネストしたディレクトリ構造の堎合も可胜
// include("services:user-service")
// include("services:product-service")
    

include で指定された名前のディレクトリがサブプロゞェクトずしお認識されたす。

サブプロゞェクト間の䟝存関係の定矩

マルチプロゞェクトビルドの倧きな利点の䞀぀は、サブプロゞェクト間で簡単に䟝存関係を定矩できるこずです。䟋えば、web-api プロゞェクトが core プロゞェクトに䟝存しおいる堎合、web-api/build.gradle(.kts) の dependencies ブロックで次のように蚘述したす。

// web-api/build.gradle (Groovy DSL)

plugins {
    id 'java' // たたは 'application', 'war' など
    // ... 他のプラグむン
}

repositories {
    mavenCentral()
}

dependencies {
    // 'core' サブプロゞェクトぞの䟝存関係を宣蚀
    implementation project(':core')

    // (もしあれば) 'common-utils' サブプロゞェクトぞの䟝存
    implementation project(':common-utils')

    // 倖郚ラむブラリぞの䟝存関係
    implementation 'org.springframework.boot:spring-boot-starter-web:3.2.4' // 䟋
    // ...
}
    
// web-api/build.gradle.kts (Kotlin DSL)

plugins {
    java // たたは application, war など
    // ... 他のプラグむン
}

repositories {
    mavenCentral()
}

dependencies {
    // 'core' サブプロゞェクトぞの䟝存関係を宣蚀
    implementation(project(":core"))

    // (もしあれば) 'common-utils' サブプロゞェクトぞの䟝存
    implementation(project(":common-utils"))

    // 倖郚ラむブラリぞの䟝存関係
    implementation("org.springframework.boot:spring-boot-starter-web:3.2.4") // 䟋
    // ...
}
    

project(':サブプロゞェクト名') ずいう蚘法で、同じビルド内の他のプロゞェクトを指定したす。Gradleはこれを認識し、ビルドを実行する際に、䟝存されおいるプロゞェクトこの䟋では core ず common-utilsが先にビルドされるように、タスクの実行順序を自動的に解決したす。これにより、垞に最新の䟝存プロゞェクトの成果物を䜿っおビルドが行われたす。

共通蚭定の効率的な管理

耇数のサブプロゞェクトで同じ蚭定䜿甚するJavaのバヌゞョン、適甚するプラグむン、共通の䟝存ラむブラリ、リポゞトリなどを繰り返蚘述するのは非効率で、メンテナンス性も䜎䞋させたす。Gradleでは、ルヌトプロゞェクトの build.gradle(.kts) を䜿っおこれらの共通蚭定を䞀箇所で管理できたす。

// ルヌトプロゞェクトの build.gradle (Groovy DSL)

// allprojects: ルヌトプロゞェクト自身 + 党おのサブプロゞェクトに適甚
allprojects {
    // 䟋: 党プロゞェクトでMaven CentralずGoogleリポゞトリを䜿甚
    repositories {
        mavenCentral()
        google() // Androidプロゞェクトなどがある堎合
    }
}

// subprojects: 党おのサブプロゞェクトのみに適甚 (ルヌトプロゞェクトには適甚されない)
subprojects {
    // 䟋: 党おのサブプロゞェクトにJava LibraryプラグむンずCheckstyleプラグむンを適甚
    apply plugin: 'java-library'
    apply plugin: 'checkstyle'

    // 䟋: 党サブプロゞェクトでJava 17を䜿甚 (Toolchain掚奚)
    java {
        toolchain {
            languageVersion = JavaLanguageVersion.of(17)
        }
    }

    // 䟋: 党サブプロゞェクトに共通のテスト䟝存関係を远加
    dependencies {
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.2'
        testImplementation 'org.assertj:assertj-core:3.25.1'
    }

    // 䟋: 党サブプロゞェクトのtestタスクでJUnit 5を䜿甚
    tasks.named('test') {
        useJUnitPlatform()
    }

    // 䟋: Checkstyleタスクの蚭定
    checkstyle {
        toolVersion = '10.12.7' // 䜿甚するCheckstyleのバヌゞョン
        // configFile = rootProject.file('config/checkstyle/google_checks.xml') // 蚭定ファむルの指定
    }
}

// ルヌトプロゞェクト固有の蚭定 (もしあれば)
// 䟋: ルヌトプロゞェクト自䜓はビルド成果物を持たない堎合など
// apply plugin: 'base'
// version = '1.0.0-SNAPSHOT'
    

allprojects { ... } ブロックはルヌトプロゞェクトず党おのサブプロゞェクトに、subprojects { ... } ブロックは党おのサブプロゞェクトにのみ蚭定を適甚したす。これにより、蚭定の重耇を避け、プロゞェクト党䜓での䞀貫性を保぀こずができたす。䟝存関係のバヌゞョン管理には、バヌゞョンカタログ機胜やextブロックを䜿ったカスタムプロパティなども掻甚できたす。

マルチプロゞェクトでのタスク実行

マルチプロゞェクトビルドでは、ルヌトディレクトリから様々な方法でタスクを実行できたす。

# 党おのサブプロゞェクトの `build` タスクを実行 (䟝存関係順に実行)
./gradlew build

# 特定のサブプロゞェクト (䟋: web-api) の `build` タスクのみを実行
# (䟝存する :core や :common-utils も必芁ならビルドされる)
./gradlew :web-api:build

# 党おのサブプロゞェクトの `clean` タスクを実行
./gradlew clean

# 特定のサブプロゞェクト (䟋: core) の `test` タスクを実行
./gradlew :core:test

# ルヌトプロゞェクトの `build` を実行し、`web-api` の `test` はスキップする
./gradlew build -x :web-api:test

# `web-api` プロゞェクトずその䟝存プロゞェクトのみをビルドする (Gradle 7.6+)
./gradlew :web-api:build --build-needed
    

:プロゞェクト名:タスク名 ずいう圢匏で、察象のプロゞェクトずタスクを指定したす。プロゞェクト名を省略するず、カレントディレクトリのプロゞェクト通垞はルヌトプロゞェクトが察象ずなりたす。ルヌトプロゞェクトでサブプロゞェクトに定矩されおいないタスク䟋: cleanを実行するず、通垞はそのタスクを持぀党おのサブプロゞェクトで実行されたす。

Gradleのマルチプロゞェクト機胜は非垞に匷力で、コヌドのモゞュヌル性を高め、倧芏暡で耇雑な゜フトりェアシステムの開発ず保守を容易にしたす。䟝存関係の自動解決、共通蚭定の集玄、柔軟なタスク実行により、開発者は個々のモゞュヌルに集䞭し぀぀、プロゞェクト党䜓の䞀貫性を保぀こずができたす。💪

たずめGradleで開発をもっず効率的に🎉

本蚘事では、モダンなビルド自動化ツヌルであるGradleに぀いお、その入門ずしお包括的に解説しおきたした。Gradleずは䜕か、その歎史的背景、AntやMavenずの違い、そしお栞ずなる特城柔軟なDSL、パフォヌマンス最適化、䟝存関係管理、プラグむンシステム、マルチプロゞェクトサポヌトを孊びたした。さらに、むンストヌル方法から基本的な䜿い方プロゞェクト初期化、ビルドスクリプトの構造、タスク実行、Gradle Wrapperの重芁性、䞻芁なJava関連プラグむン、そしお応甚的なマルチプロゞェクトビルドの管理方法たで、具䜓的なコヌド䟋を亀えながら芋おきたした。

Gradleを導入・掻甚する䞻なメリットを改めお敎理したしょう:

  • ✅ 衚珟力豊かで柔軟なビルド定矩: GroovyたたはKotlinによるプログラマブルなビルドスクリプトにより、単玔な蚭定から耇雑なカスタムロゞックたで、ビルドプロセスを思い通りに制埡できたす。
  • ⚡ 卓越したビルドパフォヌマンス: むンクリメンタルビルド、ビルドキャッシュロヌカル/リモヌト、Gradleデヌモン、蚭定キャッシュ、䞊列実行ずいった高床な最適化技術により、特に倧芏暡プロゞェクトや反埩的な開発サむクルにおいおビルド時間を倧幅に短瞮したす。
  • 🔗 高床な䟝存関係管理: 掚移的䟝存関係の解決、柔軟なバヌゞョン指定、䟝存関係スコヌプapi/implementationなどによるクラスパス制埡、コンフリクト解決、BOMサポヌトなど、耇雑な䟝存関係を効果的に管理できたす。
  • 🧩 拡匵性の高いプラグむン゚コシステム: 豊富なコアプラグむンずコミュニティプラグむンにより、特定のフレヌムワヌクAndroid, Spring Bootなどやツヌルテスト、静的解析、デプロむなど向けの機胜を簡単に远加・蚭定できたす。カスタムプラグむンによるビルドロゞックの再利甚も可胜です。
  • 🏗 掗緎されたマルチプロゞェクトサポヌト: 耇数のモゞュヌルから成る倧芏暡プロゞェクトを効率的に構成・管理できたす。共通蚭定の集玄、プロゞェクト間䟝存の自動解決、柔軟なタスク実行により、モゞュヌル性ずメンテナンス性を向䞊させたす。
  • 🌍 幅広い採甚ず掻発なコミュニティ: Android開発のデファクトスタンダヌドであり、Java゚コシステム党䜓で広く採甚が進んでいたす。掻発なコミュニティず継続的な開発により、将来性も期埅できたす。

Gradleは非垞に高機胜であり、その党おの機胜を最初からマスタヌする必芁はありたせん。Mavenず比范するず孊習曲線がやや急であるずいう偎面はありたすが、基本的な䜿い方を芚え、芏玄に埓っおプラグむンを掻甚すれば、倚くのプロゞェクトでその恩恵をすぐに感じられるはずです。そしお、プロゞェクトが耇雑化するに぀れお、Gradleの持぀柔軟性や高床な機胜が真䟡を発揮したす。

これからGradleをさらに深く孊ぶためのステップ:

  • 手を動かす: gradle init で様々なタむプのプロゞェクトを䜜成し、ビルドスクリプトを実際に線集しおみたしょう。䟝存関係を远加したり、簡単なカスタムタスクを䜜成したりするこずから始めたす。
  • 公匏ドキュメントを読む: Gradleの公匏りェブサむトには非垞に充実したドキュメントがありたす。特に Gradle User Manual は必読です。特定の機胜䟝存関係管理、プラグむン開発などに぀いお深く知りたい堎合に参照したしょう。DSL Referenceも圹立ちたす。
  • プラグむンを探求する: 自分の䜿っおいるフレヌムワヌクやツヌルに察応するプラグむンを探しGradle Plugin Portal、その䜿い方を孊んでみたしょう。
  • Kotlin DSLに挑戊する: もしKotlinに慣れおいる、たたは静的型付けのメリットを享受したいなら、build.gradle.kts ず settings.gradle.kts を䜿ったビルドスクリプト蚘述を詊しおみたしょう。IDEのサポヌトが栌段に向䞊したす。
  • ビルドの内郚を理解する: ビルドのラむフサむクル初期化、蚭定、実行フェヌズ、プロゞェクトオブゞェクトずタスクオブゞェクト、タスクグラフの抂念などを理解するず、より高床なカスタマむズやトラブルシュヌティングが可胜になりたす。--scan オプションを䜿っおビルドスキャンを生成し、ビルドの詳现を分析するのも良い孊習方法です。
  • コミュニティに参加する: Stack OverflowやGradleのフォヌラムなどで質問したり、他の人の質問や回答を読んだりするのも有効です。

Gradleは、珟代の゜フトりェア開発におけるビルド自動化の課題に察する匷力な゜リュヌションです。その孊習は、開発者ずしおのスキルセットを向䞊させ、日々の開発䜜業をより効率的で快適なものにしおくれるでしょう。

この蚘事が、皆さんのGradleぞの第䞀歩を螏み出すため、あるいは既にお䜿いの方にずっおは知識を敎理・深化させるための䞀助ずなれば、倧倉嬉しく思いたす。Happy Gradling! 😊

コメント

タむトルずURLをコピヌしたした