Slide 1

Slide 1 text

ビルドツールとはなにか?からはじめる Gradle超入門 ヨヨイ / Hayato Nishimura @JJUG CCC 2024 Spring 2024-06-16

Slide 2

Slide 2 text

自己紹介 ヨヨイ / Hayato Nishimura STORES 株式会社 所属 Java歴 もうすぐ2年 JJUG CCC 参加2回目 nhayato.com 2

Slide 3

Slide 3 text

発表の前に: フィードバックのお願い&利用環境 JJUGのアンケート、本発表では以下を大歓迎します! ● 感想: 🙋「理解しやすかった」「ここがわかりやすかったよ」 ● 指摘: 🙋 「わかりにくかったよ」「その説明はおかしいんじゃない?」 利用環境 ● Gradle 8.5(執筆時点最新バージョンは 8.8) ● OS: macOS Sonoma ● IDE: IntelliJ IDEA 2024.1.3 3

Slide 4

Slide 4 text

目次 ● 本発表のゴール と Take-home Message ● ビルドツールとはなにか と Javaにおけるビルドツール紹介 ● Gradleの基本概念とGradleディレクトリ構成の確認 ● IntelliJ IDEAからライブラリを追加し、Gradleを動かしてみる ● まとめ 4

Slide 5

Slide 5 text

本発表のゴール 本発表では皆さんが20分で以下の状態になるための情報を提供します ● Gradleを初めて使うときに何をすべきかわかる ● 現代におけるビルドツールの役割を知る ● ビルドツールGradleの基本概念とディレクトリ構造を理解できる 5 前提知識: ● Javaのプログラムは書いて実行したことがある

Slide 6

Slide 6 text

Take-home Message Gradleを使うときは公式Documentを読もう!! 6 docs.gradle.org

Slide 7

Slide 7 text

Take-home Message: 公式Documentを読もう!! ● 過去の私: ○ ツール利用中のわからないこと→「検索してWebの記事を見ればいいや」 ○ プログラミング言語ではないし、ドキュメントは読まずに実行したい ○ (ビルド|テスト)したいだけで、公式Docを読まなければならないのか? 7 ● その結果: ○ テスト等の実行はできるが、具体的にどこに記述されているのか不明瞭 ○ プロジェクトのバージョンアップで必要な段取りがわからない ○ 過去のバージョンで使われていた表記が残り続けていることに混乱

Slide 8

Slide 8 text

Take-home Message: 公式Documentを読もう!! ● 読む価値があると思う理由 ○ ツール自体の使われ方の変化が早いため、過去まとめ記事が逆に混乱を生む ■ 公式Docは「最新では少なくともこのように書く」という知識獲得 ○ 利用方法が複数あり現場によって異なる→Web上の情報が集約されない ■ 利用方法の例: CLIツール・IDE経由・Framework経由 ○ 公式Docが純粋にチュートリアル/ドキュメントとしてよくできている 8

Slide 9

Slide 9 text

今回の内容 💪今回は皆さんと公式ドキュメントの内容を確認! User Guide - Running Gradle Builds の Getting Started の内容を圧縮してご紹介 9 Core Concept Tutorial + = 本発表 読了目安: 25分 読了目安: 55分 発表時間: 20分

Slide 10

Slide 10 text

目次 ● 本発表のゴール と Take-home Message ● ビルドツールとはなにか と Javaにおけるビルドツール紹介 ● Gradleの基本概念とGradleディレクトリ構成の確認 ● IntelliJ IDEAからライブラリを追加し、Gradleを動かしてみる ● まとめ 10

Slide 11

Slide 11 text

ビルドツールとはなにか 11 全てのビルドシステムの根底には単純明快な目的がある。 それは、エンジニアたちが書いたソースコードを 機械が読める実行可能バイナリに変換するというものだ。 18章 ビルドシステムとビルド哲学 より ソース コード ビルド システム (ツール) バイナリ 変換する Googleのシンプルな説明

Slide 12

Slide 12 text

ビルドツールとはなにか 12 実世界のビルドツールが担っていること 🪣Inputの収集 ライブラリ依存解決 🔍Inputの整理・確認 プロジェクト分割 ソースコード静的解析 テスト 🔄変換 コンテナイメージ化 JARパッケージング ⏫Outputの展開 リポジトリへアップロード 󰠁開発ツール補助 IDEの初回セットアップ アプリの起動 ライブラリインストール etc.

Slide 13

Slide 13 text

ビルドツールとはなにか 13 Googleの言う単純明快な目的 実世界のビルドツールが 担っていること ● 🪣Inputの収集 ● 🔍Inputの整理・確認 ● 🔄変換 ● ⏫Outputの展開 ● 󰠁開発ツール補助 ● etc. 大きなギャップがありそう ソース コード 等 ビルド システム (ツール) バイナリ 等 変換する

Slide 14

Slide 14 text

ビルドツールとはなにか ビルドツールとは、なんでもできる開発用自動化ツール ● 「変換する」ことと、具体的に実現しているタスクに大きなギャップがある ○ 大局的に捉えれば、すべて「変換」ではあるが、実行タスクは多岐にわたる 14 ● 開発者の自動化のモチベーションがあり、 ユースケースがたくさんある以上、ツールとして抽象化はMust ○ しかし抽象化の結果、新参者には理解が難しくなってくる ● ビルドツールにどこまで任せるかはツール作成者のさじ加減がある

Slide 15

Slide 15 text

Javaにおけるビルドツール ● Apache Ant ○ MakeのJavaアレンジ ○ 古くからのプロジェクトでは利用 ○ 自由度が高すぎて理解が難しい ● Apache Maven ○ Gradleと同世代のビルドツール ○ Gradleと比較し、自由度は低い ○ Javaの入門書ではこちらの採用が多い ● Gradle ○ Androidアプリケーション開発のデファクト ○ XMLではなく、プログラミング言語で記述 15 ※他にもありますがとりあえず...

Slide 16

Slide 16 text

Javaにおけるビルドツール 16 https://insights.stackoverflow.com/trends?tags=gradle%2Cmaven%2Cbazel%2Csbt%2Cant Stack Overflow Trends: タグの利用傾向のグラフ mavenとgradleが同程度 2010年頃トップだったantは、 下降傾向

Slide 17

Slide 17 text

目次 ● 本発表のゴール と Take-home Message ● ビルドツールとはなにか と Javaにおけるビルドツール紹介 ● Gradleの基本概念とGradleディレクトリ構成の確認 ● IntelliJ IDEAからライブラリを追加し、Gradleを動かしてみる ● まとめ 17

Slide 18

Slide 18 text

Gradleの基本概念 18 https://docs.gradle.org/8.5/userguide/gradle_basics.html ProjectをGradleに読ませてOutputを出す! Gradle公式ドキュメントの先頭に掲載されている図

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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の振る舞い」 疑問

Slide 21

Slide 21 text

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で どのようにタスクを定義するかは後述

Slide 22

Slide 22 text

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を利用した現場も多そうなので、ご紹介

Slide 23

Slide 23 text

Gradleの利用方法: gradleコマンドのインストールは必要ない A. 既存プロジェクトに参画する ● ビルドツールとしてGradleを使っている(=利用可能) ○ gradleコマンドは内包されている B. 新しくプロジェクトを作成する ● gradle コマンドから作成($gradle init)(※gradleのインストール必要) ● Web FrameworkにGradleが内包されている ○ 例: Spring Initializr (start.spring.io)を使って作成したプロジェクトにはgradleが含まれる ● IDE の新規プロジェクト作成時にビルドツールをGradleに設定する 23

Slide 24

Slide 24 text

Gradle新規プロジェクトをIntelliJ IDEAから作成 24 ツールバーから以下を選択 ファイル > 新規 > プロジェクト...

Slide 25

Slide 25 text

Gradle新規プロジェクトをIntelliJ IDEAから作成-2 25 ① 新規プロジェクト-Javaを 選択 ② ビルドシステム: Gradleを選択 ※他の設定項目は補足に掲載

Slide 26

Slide 26 text

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 以下のファイル/ディレクトリが作成される

Slide 27

Slide 27 text

作成されたファイルを眺めてみる 27 . ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src(略) 覚えるのは3つだけ! ① Gradle Wrapper ② Settings File ③ Build Files

Slide 28

Slide 28 text

① 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

Slide 29

Slide 29 text

② 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の設定が書かれています

Slide 30

Slide 30 text

③ 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に 配置されている

Slide 31

Slide 31 text

③ 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が提供するプラグインが基本的な タスクは定義してくれているため、 プロジェクト固有の設定を渡すだけで タスクは実行できる

Slide 32

Slide 32 text

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が提供するプラグインが基本的な タスクは定義してくれているため、 プロジェクト固有の設定を渡すだけで タスクは実行できる

Slide 33

Slide 33 text

参考: Groovy DSLとKotlin DSLについて 33 Gradleの設定ファイルで利用できる言語は、GroovyとKotlinがある ここまでの説明ではGroovyを選択したが、Kotlinを選択すると 設定ファイルの拡張子が .gradle ではなく .gradle.kts となる

Slide 34

Slide 34 text

IDE上からのGradleの操作(IntelliJ IDEAの場合) 34 プロジェクト作成直後のIDEの画面 ①左にGradleアイコン →クリック

Slide 35

Slide 35 text

IDE上からのGradleの操作(IntelliJ IDEAの場合) 35 ②Gradleツールウィンドウが表示

Slide 36

Slide 36 text

IDE上からのGradleの操作(IntelliJ IDEAの場合) 36 CUIで、 $./gradlew tasks とした時と 同じ構造を持つ Gradleツールウィンドウに tree形式でtaskが表示されている ⚙をクリックすることで、taskを実行できる buildしたいときは、 ⚙buildをクリック

Slide 37

Slide 37 text

IDE上からのGradleの操作(IntelliJ IDEAの場合) 37 開発中はテスト実行のため verification/test を 実行することが圧倒的に多い 🔄マークで設定再読み込み (これを知らなくてハマった経験あり)

Slide 38

Slide 38 text

目次 ● 本発表のゴール と Take-home Message ● ビルドツールとはなにか と Javaにおけるビルドツール紹介 ● Gradleの基本概念とGradleディレクトリ構成の確認 ● IntelliJ IDEAからライブラリを追加し、Gradleを動かしてみる ● まとめ 38

Slide 39

Slide 39 text

IntelliJ IDEAからGradleを動かしてみる ● 最高のJava指南書『プロになるJava』では ビルドツールとしてMavenが紹介されている ● 紹介されているシナリオを 先ほど作成したプロジェクトを利用し Gradleでもやってみる ● シナリオ: Maven Central Repositoryから businessCalendar4jというライブラリを取得し、 日本の祝日を表示するプログラムを書く ● 3ステップで実現 39

Slide 40

Slide 40 text

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)

Slide 41

Slide 41 text

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上では 実行できるが...

Slide 42

Slide 42 text

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 🔄マークで設定を 再読み込みすると...

Slide 43

Slide 43 text

ライブラリを追加してGradleから実行してみる 43 runタスクの実行結果 無事ライブラリの利用ができ、 祝日が表示された

Slide 44

Slide 44 text

タスクの依存とインクリメンタルビルドについて 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 インクリメンタルビルド: 変更なしとして扱われ、実行時間を短縮できる 変更なし

Slide 45

Slide 45 text

まとめ 本発表では、皆さんが20分で以下の状態になるための情報を提供しました ● Gradleを初めて使うときに何をすべきかわかる ○ ⇒公式ドキュメントを読もう ● 現代におけるビルドツールの役割を知る ○ ⇒何でもできる自動化ツールの側面を持っている ● ビルドツールGradleの基本概念とディレクトリ構造を理解できる ○ ⇒IDEを使ってgradleプロジェクトを作成し、作成されるファイルを眺め、 基礎的なライブラリの追加を実施しました ○ ⇒Gradle経由でJavaアプリケーションを起動させました 45

Slide 46

Slide 46 text

参考文献等 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

Slide 47

Slide 47 text

まとめ 本発表では、皆さんが20分で以下の状態になるための情報を提供しました ● Gradleを初めて使うときに何をすべきかわかる ○ ⇒公式ドキュメントを読もう ● 現代におけるビルドツールの役割を知る ○ ⇒何でもできる自動化ツールの側面を持っている ● ビルドツールGradleの基本概念とディレクトリ構造を理解できる ○ ⇒IDEを使ってgradleプロジェクトを作成し、作成されるファイルを眺め、 基礎的なライブラリの追加を実施しました ○ ⇒Gradle経由でJavaアプリケーションを起動させました 47

Slide 48

Slide 48 text

参考情報 48

Slide 49

Slide 49 text

バージョンカタログについて Q: チュートリアルに libs.versions.toml ってファイルの説明があるがこれは何? A: Version Catalog というバージョン管理の仕組みのためのファイル ● 発表者が利用しているSpring Bootのエコシステムでは 導入されていなさそうなので、省略した ● 最新版gradle 8.8 で gradle init すると作成されることは確認している ● JJUGコミュニティ内での紹介は “Gradleと仲良くなる第一歩 ~小規模PJから大規模PJへ~”が参考になる 49

Slide 50

Slide 50 text

参考: Gradleをあえてインストールする 新品状態のPCでgradleのみを実行したい場合、インストールする必要がある ● Installing Gradle を読み、利用しているOS(Linux, macOS, Windows)の 手順に従う ○ Linux, macOSの場合は、パッケージマネージャー(SDKMAN!)を利用するのがお手軽 ■ https://sdkman.io/ ■ $ sdk install gradle ○ Windowsの場合は、バイナリの入ったzipファイルをダウンロードし、適当なフォルダに展開 ■ 環境変数を通すことで実行可能になる(はず) ● インストールしたgradleコマンドを呼び出すことは最初のときだけになる ○ プロジェクトにGradle Wrapperが内包されているため 50

Slide 51

Slide 51 text

Gradle新規プロジェクトをIntelliJ IDEAから作成-2-詳細 51 「新規プロジェクト」ダイアログ ボックスから以下を入力 ● サイドバーから 新規プロジェクト > Java を選択 ● 名前: jjug-ccc(任意) ● 場所: ~/tmp(任意) ● ビルドシステム: Gradle ● JDL: Java21(任意) ● Gradle DSL: Groovy 作成ボタンをクリック