Gradle徹底入門
ゴール
以下を理解したい。
gradleプロジェクトを作成した時に作られる各ファイルの役割ビルドツールにおけるGradleの位置付け- gradleホームの役割
- タスクやプラグインなどの基礎
- Junitの全テストが実行されているか把握するには?
FAT JARの作成方法warファイルの作成方法プロキシがある場合のgradleラッパーの活用方法独自jarの読み込み方法- build.gradleの一部タスクの共通化
- 各プロジェクトへjarファイルを配布する方法
- 既存プロジェクトにgradleを導入する方法
buildコマンドとtaskコマンドの違いとは- プロパティファイルのパスの通し方
モチベーション
Gradle徹底入門のメモ。業務でCI/CD環境を作りたいので。
バージョンは2.xとかなり古いが背景や基礎を学べれば。代わっている部分はドキュメントで補おう。
リポジトリ
本を読みながら書いたプログラムはこちら
ビルドツールについて
ビルドとビルドツール
基本的なビルドの定義とは、コンパイル、外部ライブラリのリンク、静的解析、テスト、パッケージングなどを通じて、実行可能なファイルを生成すること。
文脈次第でビルドに含める作業は変わってくる。デプロイまで含めていることもあり、広義の意味としてこのような定型作業全般をビルドと呼んだりする人もいる。ビルドツールはこのような定型的作業を自動化するためのソフトウェアである。
ビルドツールがないと具体的にどう困るのか
- 無限ライブラリ地獄
- これ体験したことがある。分かりみがすごい。
- 手順書の陳腐化
- 環境構築方法とか、あの手のExcelの手順書って更新されないよね。
- 環境依存によるエラー
- windowsとlinuxの違いとか本番環境と検証環境の違いとか手作業によるミス。あるある
- デプロイが疲弊作業に
- DBのパスが合ってるかなどのチェック作業、認知負荷がめっちゃ高いから疲弊する。
ビルド手順書が紙切れではなくプログラムに!
現在の業務では、ビルド作業は必ず自分が行っているのだが、属人性をなくすために、ビルド手順書を作った。(この本ではそのような作業をする人はビルド職人と言われていた)
ただ、その手順書があっても別の人にビルド作業を依頼するのは少々怖い。
Gradleを使えば、そのような人がやる作業はプログラム化される。結果的にそのような不安を完全に取り除くことができる。
ビルドツールの進化におけるGradleの位置付け
ビルドツールはMake→Ant→Maven→Gradleという進化を経てきた。
- Make:ビルドというコンセプトの確立。スクリプト言語を採用。UNIX系OSのみ使えた。
- Ant:クロスプラットフォーム対応。汎用性を高めることに成功。XMLを採用。
- Maven:規約ベース。記述の効率化に成功。XMLを採用。
- Gradle:規約ベース。スクリプト言語への回帰によりMavenよりも柔軟性を持たせることに成功。
規約ベースとは?
規約に従ったプロジェクト構造を使う限りにおいてはビルドスクリプトを大幅に省略可能である仕組み。ただ、Gradleは規約から外れても柔軟に対応可能。
個別インストール不要!
Gradleラッパーという機能があり、Gradleを個別インストールせずとも、自動的にインストールしてくれる。
プロキシの関係でインターネットからインストールできなくても、社内のファイルサーバーなどにGradleのバイナリを配置しておけば、それをインストールして使ってもらうことができる。
gradlewコマンドを実行すればいいと。これについては後で詳しく見ていきたい。
Gradleの互換性への配慮
- 破壊的なバージョンアップは行わない
- 機能廃止は段階的に行う。廃止されることをwarningなどで明示してくれる
- 新機能は十分なフィードバックを受けてから安定したものを取り込む
ライフサイクル
機能は以下のようなライフサイクルを経る。
- 非公開
- 実験的
- 公開
- デフォルトのステータス。除去対象になっても廃止ステータスを必ず経る。この機能が変更されても後方互換性を維持するよう努める。
- 廃止
- 廃止ステータスに移行した機能は次のメジャーバージョンアップで除去
Gradleのインストール
You can install Gradle Build Tool on Linux, macOS, or Windows. The installation can be done manually or using a package manager like SDKMAN! or Homebrew.
You can find all Gradle releases and their checksums on the releases page.
SDKMAN!は旧GVMらしい。パッケージマネージャ的役割。今回はhomebrewでインストールした。
gradleのタスクの実行
build.gradleを定義して以下のタスクを設定した。クロージャーを使っているらしい?
task hello {
doLast {
println 'Hello world!'
}
}
デフォルトではカレントディレクトリのbuild.gradleを読み込んでタスクを実行できる。
gradle hello
で実行できる。
ログ
gradle -i hello
などとするとログ出力できる。
- -i(info)
- ログレベルがINFOに設定。ビルドスクリプトのファイル名などが表示。
- -s(stacktrace)
- 例外発生時にユーザー例外のみ出力。これが一番使えそうだ。
- -S(full stacktrace)
- 全てのスタットレースを出力する。
Gradle wrapperの意義
現在進行中のプロジェクトにGradleを導入したいとなってもハードルは高い。自分一人ならいいが、各開発者にGradleの良さを説明し、インストールしてもらって、セットアップして、、、。はい、挫折。
Gradle wrapperがあればインストールとセットアップをコマンドで実行してくれる。導入への障壁を下げられる。
- バージョンの強制ができる
- JenkinsなどのCIサーバーにGradleをインストールしなくても良い
というメリットもある。
実行
この方法でインストールした場合は、gradlewコマンドを使う必要がある。グローバルにインストールしているわけではないからgradleでは実行できない。
各初期ファイルの役割
- gradle/wrapper/gradle-wrapper.jar:Gradleラッパーのブートストラップ
- gradle/wrapper/gradle-wrapper.properities:Gradleラッパー設定ファイル
- gradlew:Gradleラッパ起動用シェルスクリプト
- gradlew.bat:Gradleラッパ起動用バッチファイル(windows用)
標準機能でJavaのビルドはできない
Gradleのコア機能ではJavaのビルドはできない。プラグインとして追加する必要がある。
GradleはJavaのビルドツールというより、プラグインで拡張可能な自動化ツールという解釈が正しい。
これは実際、公式サイトでは以下のように謳っている。
モバイルアプリからマイクロサービスまで、小さなスタートアップから大企業まで、Gradleはチームがより良いソフトウェアをより速く構築、自動化し、提供できるようにします。
また、Build Anythingとして様々な言語で使うことができる。
Java、Kotlin、C++など、お好きな言語で書いてください。どのプラットフォームにもデプロイできるようにパッケージ化する。モノレポでもマルチレポでも。そして、Gradleの比類ない多機能性に頼って、すべてをビルドしてください。
JavaCompile型のタスクへの一括指定
compileJavaタスクやcompileTestJavaタスクなどはJavaCompile型のタスクである。UTF-8でコンパイルを行うようにするには、以下のように設定する。
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
Javaプラグインが提供するタスク
- compileJava
- processResources
- classes
- compileTestJava
- processTestResources
独自のjarを読み込む方法
Gradle8.6でプロジェクト内に配置したjarファイルを読み込むには、dependenciesに以下のように記述する。(ルート直下のlibsディレクトリに配置する場合)
implementaition fileTree(dir: 'libs', include: '*.jar')
Gradleのバージョンと対応するJavaのバージョンについて
Java21をGradle7系で実行しようとしたらエラーが起こった。以下のバージョン表を確認すること。
認証なしプロキシでGradleを動かすには
プロキシ環境下では、Gradle wrapperを使ったインストールができない。GradleはJVMで動く。そのJVMに証明書がインストールする必要がある。認証なしだったので、properitiesなどに設定せずにkeytoolコマンドを使って対象にインストールするだけで良い。
eclipseを起動するJVMに証明書をインストールすると楽
eclipseでGradleプロジェクトを作成したり、インポートする場合、手っ取り早いのはeclipseが利用するJVMに証明書をインストールすること。
pleadesでインストールした場合内包されているJavaのランタイムを利用していることがわかった。eclipse.iniに書かれている。
このJVMに対して証明書をインストールする。するとeclipseでgradleプロジェクトを扱う時はJAVA_HOMEにこいつが設定されるので、後々楽だという話。