Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ビルドツールとはなにか?からはじめるGradle超入門 / JJUG CCC 2024 Spring

ビルドツールとはなにか?からはじめるGradle超入門 / JJUG CCC 2024 Spring

Hayato Nishimura

June 18, 2024
Tweet

More Decks by Hayato Nishimura

Other Decks in Programming

Transcript

  1. 目次 • 本発表のゴール と Take-home Message • ビルドツールとはなにか と Javaにおけるビルドツール紹介

    • Gradleの基本概念とGradleディレクトリ構成の確認 • IntelliJ IDEAからライブラリを追加し、Gradleを動かしてみる • まとめ 4
  2. Take-home Message: 公式Documentを読もう!! • 過去の私: ◦ ツール利用中のわからないこと→「検索してWebの記事を見ればいいや」 ◦ プログラミング言語ではないし、ドキュメントは読まずに実行したい ◦

    (ビルド|テスト)したいだけで、公式Docを読まなければならないのか? 7 • その結果: ◦ テスト等の実行はできるが、具体的にどこに記述されているのか不明瞭 ◦ プロジェクトのバージョンアップで必要な段取りがわからない ◦ 過去のバージョンで使われていた表記が残り続けていることに混乱
  3. Take-home Message: 公式Documentを読もう!! • 読む価値があると思う理由 ◦ ツール自体の使われ方の変化が早いため、過去まとめ記事が逆に混乱を生む ▪ 公式Docは「最新では少なくともこのように書く」という知識獲得 ◦

    利用方法が複数あり現場によって異なる→Web上の情報が集約されない ▪ 利用方法の例: CLIツール・IDE経由・Framework経由 ◦ 公式Docが純粋にチュートリアル/ドキュメントとしてよくできている 8
  4. 今回の内容 💪今回は皆さんと公式ドキュメントの内容を確認! User Guide - Running Gradle Builds の Getting

    Started の内容を圧縮してご紹介 9 Core Concept Tutorial + = 本発表 読了目安: 25分 読了目安: 55分 発表時間: 20分
  5. 目次 • 本発表のゴール と Take-home Message • ビルドツールとはなにか と Javaにおけるビルドツール紹介

    • Gradleの基本概念とGradleディレクトリ構成の確認 • IntelliJ IDEAからライブラリを追加し、Gradleを動かしてみる • まとめ 10
  6. ビルドツールとはなにか 12 実世界のビルドツールが担っていること 🪣Inputの収集 ライブラリ依存解決 🔍Inputの整理・確認 プロジェクト分割 ソースコード静的解析 テスト 🔄変換

    コンテナイメージ化 JARパッケージング ⏫Outputの展開 リポジトリへアップロード 󰠁開発ツール補助 IDEの初回セットアップ アプリの起動 ライブラリインストール etc.
  7. ビルドツールとはなにか 13 Googleの言う単純明快な目的 実世界のビルドツールが 担っていること • 🪣Inputの収集 • 🔍Inputの整理・確認 •

    🔄変換 • ⏫Outputの展開 • 󰠁開発ツール補助 • etc. 大きなギャップがありそう ソース コード 等 ビルド システム (ツール) バイナリ 等 変換する
  8. Javaにおけるビルドツール • Apache Ant ◦ MakeのJavaアレンジ ◦ 古くからのプロジェクトでは利用 ◦ 自由度が高すぎて理解が難しい

    • Apache Maven ◦ Gradleと同世代のビルドツール ◦ Gradleと比較し、自由度は低い ◦ Javaの入門書ではこちらの採用が多い • Gradle ◦ Androidアプリケーション開発のデファクト ◦ XMLではなく、プログラミング言語で記述 15 ※他にもありますがとりあえず...
  9. 目次 • 本発表のゴール と Take-home Message • ビルドツールとはなにか と Javaにおけるビルドツール紹介

    • Gradleの基本概念とGradleディレクトリ構成の確認 • IntelliJ IDEAからライブラリを追加し、Gradleを動かしてみる • まとめ 17
  10. Gradleの基本概念 19 Project settings.gradle build.gradle source code Task Gradle Plugins

    Output 完了したタスク JARやZIP CI・リポジトリへの アップロード Dependencies ProjectをGradleに読ませてOutputを出す! Gradle公式ドキュメントの先頭に掲載されている図を拡大
  11. Gradleの基本概念 20 Project settings.gradle build.gradle source code Task Gradle Plugins

    Output 完了したタスク JARやZIP CI・リポジトリへの アップロード Dependencies ProjectをGradleに読ませてOutputを出す! Gradle公式ドキュメントの先頭に掲載されている図を拡大 Gradle automates building, testing, and deployment of software from information in build scripts. https://docs.gradle.org/8.5/userguide/gradle_basics.html Project とは? build scripts とは? ドキュメントに書いてある「Gradleの振る舞い」 疑問
  12. Gradleの基本概念-2 21 Project: Task: 「コードコンパイル」や「test実行」といった仕事の単位 build.gradleというbuild scriptに記載 Project settings.gradle build.gradle

    source code Task A Gradle project is a piece of software that can be built, such as an application or a library. ドキュメント曰く https://docs.gradle.org/8.5/userguide/gradle_basics.html ビルドを実行するソフトウェアのまとまり Javaを利用した開発では、IDEやFrameworkで 規定するプロジェクトと対応する(と理解) ProjectとTaskの説明 build.gradleで どのようにタスクを定義するかは後述
  13. Gradleの基本概念-3 22 Project: • Single Project: root Projectからなる単一のプロジェクト • Multi-project:

    1つのrootと複数のsubprojectからなる プロジェクト Project settings.gradle build.gradle source code Task Project settings.gradle build.gradle source code Task sub-project-1 sub-project-2 ︙ Projectは入れ子構造にできる Multi-projectを利用した現場も多そうなので、ご紹介
  14. Gradleの利用方法: gradleコマンドのインストールは必要ない A. 既存プロジェクトに参画する • ビルドツールとしてGradleを使っている(=利用可能) ◦ gradleコマンドは内包されている B. 新しくプロジェクトを作成する

    • gradle コマンドから作成($gradle init)(※gradleのインストール必要) • Web FrameworkにGradleが内包されている ◦ 例: Spring Initializr (start.spring.io)を使って作成したプロジェクトにはgradleが含まれる • IDE の新規プロジェクト作成時にビルドツールをGradleに設定する 23
  15. Gradle新規プロジェクトをIntelliJ IDEAから作成-3 26 . ├── build.gradle ├── gradle │ └──

    wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src ├── main │ ├── java │ └── resources └── test ├── java └── resources 以下のファイル/ディレクトリが作成される
  16. 作成されたファイルを眺めてみる 27 . ├── build.gradle ├── gradle │ └── wrapper

    │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src(略) 覚えるのは3つだけ! ① Gradle Wrapper ② Settings File ③ Build Files
  17. ① Gradle’s Wrapper (Shell Script/バッチファイル) 28 . ├── build.gradle ├──

    gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src(略) gradleのCLIツール gradleコマンドを個別にインストールし なくてもプロジェクト内から実行できる プロジェクトに内包することで、 他の人とGradleのバージョンを合わせることが できる 中身を読むと ./gradle/wrapper 以下 のjarを実行していることがわかる GradleをIDE上から実行する場合は 意識しないが、 Scriptから呼び出したり、CIを設定する 場合は利用する ※WindowsとmacOS, Linuxどちらでも対応 • (mac/lin)$ ./gradlew run • (win) $ gradlew.bat run
  18. ② Settings File 29 全体の設定ファイル Gradleの実行にmustではないが、 作成されていることが多いためご紹介 今回作成したファイルには rootProject名のみが記載されている rootProject.name

    = 'jjug-ccc' settings.gradle . ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src(略) 私の職場ではMulti-projectの設定が書かれています
  19. ③ Build Files 30 タスクを記載するファイル(必須) 具体的には、以下の3つが記載されている • ビルドの設定 • taskについて

    • pluginについて また、2つの依存関係が記載されている • Gradleとbuild script • プロジェクトで利用するライブラリ . ├── app │ ├── build.gradle │ └── src(略) ├── build.gradle ︙ └── settings.gradle . ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src(略) sub-projectを持つ場合 sub-projectのrootに 配置されている
  20. ③ Build Files 31 build.gradle plugins { id 'java' }

    group = 'org.example' version = '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' } test { useJUnitPlatform() } build.gradleの内容 Gradleが提供するプラグインが基本的な タスクは定義してくれているため、 プロジェクト固有の設定を渡すだけで タスクは実行できる
  21. plugins { id 'java' } group = 'org.example' version =

    '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' } test { useJUnitPlatform() } ③ Build Files 32 java プラグインの利用 を指定 依存するライブラリは Maven Centralという リポジトリから取得 依存関係の設定: testコンパイルと実行時に junit-jupiter (JUnit 5)が必要 testタスクで JUnit Platformを利用する ことを指定 プロジェクトのグループID とversionの設定 build.gradle build.gradleの内容 Gradleが提供するプラグインが基本的な タスクは定義してくれているため、 プロジェクト固有の設定を渡すだけで タスクは実行できる
  22. 目次 • 本発表のゴール と Take-home Message • ビルドツールとはなにか と Javaにおけるビルドツール紹介

    • Gradleの基本概念とGradleディレクトリ構成の確認 • IntelliJ IDEAからライブラリを追加し、Gradleを動かしてみる • まとめ 38
  23. IntelliJ IDEAからGradleを動かしてみる-1 40 dependencies { implementation 'one.cafebabe:businessCalendar4j:1.3.2' testImplementation platform( 'org.junit:junit-bom:5.10.0')

    testImplementation 'org.junit.jupiter:junit-jupiter' } 追加: Maven Centralから businessCalender4jを取得 Build Fileに依存の記述 (build.gradle)
  24. IntelliJ IDEAからGradleを動かしてみる-2 41 Javaファイルの作成 (src/main/java/org/example/JapaneseHolidays2024.java) package org.example; import one.cafebabe.businesscalendar4j.BusinessCalendar; import

    static one.cafebabe.businesscalendar4j.BusinessCalendar.JAPAN; import java.time.LocalDate; public class JapaneseHolidays2024 { public static void main(String[] args) { BusinessCalendar.newBuilder().holiday(JAPAN.PUBLIC_HOLIDAYS).build() .getHolidaysBetween( LocalDate.of(2024, 1, 1),LocalDate.of(2024, 12, 31)) .forEach(System.out::println); }} このままでも IDE上では 実行できるが...
  25. IntelliJ IDEAからGradleを動かしてみる-3 42 plugins { id 'application' } application {

    mainClass ='org.example.JapaneseHolidays2024' } applicationプラグインはjavaプラグインを 内包しているため、javaから置換可能 Applicationプラグイン利用の記述 (build.gradle) applicationプラグインのrunタスクで 起動するmainクラスを指定する Gradleツールウィンドウ 先程までなかったapplication/runが 存在している plugins { id 'java' } Before 🔄マークで設定を 再読み込みすると...
  26. タスクの依存とインクリメンタルビルドについて 44 > Task :compileJava > Task :processResources NO-SOURCE >

    Task :classes > Task :run runタスク実行の出力 compileJava processResources classes run 各タスクをそれぞれ実行すると どのタスクに依存しているかわかる ※もっともclassesまではJava Pluginのdocに書いてあるが > Task :compileJava UP-TO-DATE > Task :processResources NO-SOURCE > Task :classes UP-TO-DATE > Task :run runタスク実行の出力(2回目) compileJava processResources classes run インクリメンタルビルド: 変更なしとして扱われ、実行時間を短縮できる 変更なし
  27. まとめ 本発表では、皆さんが20分で以下の状態になるための情報を提供しました • Gradleを初めて使うときに何をすべきかわかる ◦ ⇒公式ドキュメントを読もう • 現代におけるビルドツールの役割を知る ◦ ⇒何でもできる自動化ツールの側面を持っている

    • ビルドツールGradleの基本概念とディレクトリ構造を理解できる ◦ ⇒IDEを使ってgradleプロジェクトを作成し、作成されるファイルを眺め、 基礎的なライブラリの追加を実施しました ◦ ⇒Gradle経由でJavaアプリケーションを起動させました 45
  28. 参考文献等 Webサイト • Gradle User Manual: https://docs.gradle.org/ 書籍 • 『プロになるJava』きしだなおき,山本裕介,杉山貴章(技術評論社,

    2022) • 『Googleのソフトウェアエンジニアリング』Titus Winters, Tom Manshreck, Hyrum Wright 編 (オライリージャパン, 2011) Youtube • “Gradleと仲良くなる第一歩 ~小規模PJから大規模PJへ~” 小林 政友 @ JJUG CCC 2023 Spring • “JJUGナイトセミナー「Maven / Gradle入門」” 日本 Java ユーザーグループ (2020) 46
  29. まとめ 本発表では、皆さんが20分で以下の状態になるための情報を提供しました • Gradleを初めて使うときに何をすべきかわかる ◦ ⇒公式ドキュメントを読もう • 現代におけるビルドツールの役割を知る ◦ ⇒何でもできる自動化ツールの側面を持っている

    • ビルドツールGradleの基本概念とディレクトリ構造を理解できる ◦ ⇒IDEを使ってgradleプロジェクトを作成し、作成されるファイルを眺め、 基礎的なライブラリの追加を実施しました ◦ ⇒Gradle経由でJavaアプリケーションを起動させました 47
  30. バージョンカタログについて Q: チュートリアルに libs.versions.toml ってファイルの説明があるがこれは何? A: Version Catalog というバージョン管理の仕組みのためのファイル •

    発表者が利用しているSpring Bootのエコシステムでは 導入されていなさそうなので、省略した • 最新版gradle 8.8 で gradle init すると作成されることは確認している • JJUGコミュニティ内での紹介は “Gradleと仲良くなる第一歩 ~小規模PJから大規模PJへ~”が参考になる 49
  31. 参考: Gradleをあえてインストールする 新品状態のPCでgradleのみを実行したい場合、インストールする必要がある • Installing Gradle を読み、利用しているOS(Linux, macOS, Windows)の 手順に従う

    ◦ Linux, macOSの場合は、パッケージマネージャー(SDKMAN!)を利用するのがお手軽 ▪ https://sdkman.io/ ▪ $ sdk install gradle ◦ Windowsの場合は、バイナリの入ったzipファイルをダウンロードし、適当なフォルダに展開 ▪ 環境変数を通すことで実行可能になる(はず) • インストールしたgradleコマンドを呼び出すことは最初のときだけになる ◦ プロジェクトにGradle Wrapperが内包されているため 50
  32. Gradle新規プロジェクトをIntelliJ IDEAから作成-2-詳細 51 「新規プロジェクト」ダイアログ ボックスから以下を入力 • サイドバーから 新規プロジェクト > Java

    を選択 • 名前: jjug-ccc(任意) • 場所: ~/tmp(任意) • ビルドシステム: Gradle • JDL: Java21(任意) • Gradle DSL: Groovy 作成ボタンをクリック