※2024/06/07追記
コメントで誤記についてのご指摘をいただき、
一部画像の差し替えや誤記修正を行いました。
初めまして、堀井です。
ブログは色々書いてきたもののQiitaは初めてなのでお手柔らかにお願いします。
さて、プログラムを色々書いているとビルドツールにも手を出したくなりますよね。
Javaのビルドツールと言えばAnt, Maven, Gradleなどがありますが、今回はGradleを勉強したいなと思って調べたまとめです。
実務でMavenのシェアが高いことは承知していますが、私的利用に限れば新規にMavenを学び始める理由も薄いかなと。
では早速行きましょう。
この記事が対象としている読者
・Javaでメソッドを作ることができる
・Eclipseで開発したことがある
・Ant, Maven, Gradleと言う名前を聞いたことがある
・Gradleの知識は「ビルドツールである」くらいしか知らない
・「ビルドツールは便利らしい」と言うことを知っている
ツールのダウンロード
まずはツールのダウンロードを行います。
PleaidesとGradleをそれぞれ最新版にしましょう。
Pleaides All in One Eclipse
Pleiades All in One Eclipse ダウンロード
Eclipse本体に日本語化プラグインと言語別に便利なプラグインが入った、言わずと知れたIDE(統合開発環境)です。
赤枠の最新版を選んでください(記事更新日現在の最新はv20240325
)。
Buildshipが入っている Ultimate または Java を選択してください。
BuildshipとはGradle用のEclipseプラグインです。もちろん別途マーケットプレースからインストールしてもいいですが、どうせJavaを使うしわざわざ付属していない物を選ぶ理由もないと思います。
Gradle
Gradle
Eclipse同様に最新版をダウンロードします(記事更新日現在の最新は8.8
)。
1. Install Gradle X.X
を選択
Installing manually
からバイナリファイルをダウンロードして解凍
画面中央辺りにあります。見つからない場合はctrl + Fでページ内検索を。
ユーザマニュアルやAPI Javadocが必要な方はCompleteをダウンロードしてください。
C:\Gradle
に解凍したファイルを配置
システム環境変数を設定
環境設定画面でGRADLE_HOME
のPATHを、Gradleを配置したパスC:\Gradle\gradle-8.8
に指定します。
同様にPath
のPATHに%GRADLE_HOME%\bin
を追加します。
使用可能になったことを確認
Powershell(またはコマンドプロンプトやGit-BashなどのCUIツール)を開きgradle -v
を叩きます。
以下のようなメッセージが表示されれば成功です。
上手くいかない方はこれまでの操作に間違いないことを確認してください。
- PATHの指定と実際に配置した場所が異なっている(CドライブとDドライブの違いなど)
- PATHの指定が
C:\Gradle\gradle-8.8
と%GRADLE_HOME%bin
になっている
※%GRADLE_HOME%
は変数なのでC:\Gradle\gradle-8.8bin
になりパス誤り(\
がない) - ユーザー環境変数に既にGRADLE_HOMEが存在している(ユーザー環境変数の方が優先される)
- コマンドプロンプトを開きっぱなし(CUIツールを開きなおせば適用される)
など、ありそうなミスだと思います。
新規プロジェクトを作成する
プロジェクトディレクトリを作成
Eclipseの初期設定ではワークスペースはC:\pleiades\workspace
となっているはずなので、今回はC:\pleiades\workspace\GradlePracticeApp
とします。
CLIを起動して、プロジェクトを作成する
gradle init
を叩きます。
10秒も待つと選択肢が出てくるので「1つ目だけ2、残りはデフォルト(Enter押すだけ)」としていきます。
PS C:\pleiades\workspace\GradlePracticeApp> gradle init
Starting a Gradle Daemon (subsequent builds will be faster)
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
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]
Split functionality across multiple subprojects?:
1: no - only one application project
2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2]
Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2]
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]
Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4]
Project name (default: GradlePracticeApp):
Source package (default: gradlepracticeapp):
> Task :init
Get more help with your project: https://docs.gradle.org/7.6/samples/sample_building_java_applications.html
BUILD SUCCESSFUL in 1m 7s
2 actionable tasks: 2 executed
PS C:\pleiades\workspace\GradlePracticeApp>
あまりにも味気ないので補足。
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4]
Gradle「1.基本プロジェクトでいいよね?」
ぼく「やだ、アプリ作りたい。」
Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Enter selection (default: Java) [1..6]
Gradle「2.言語はJavaでいいよね?」
ぼく「うん」
Split functionality across multiple subprojects?:
1: no - only one application project
2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2]
Gradle「3.機能分割しないよね?」
ぼく「うん」
Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2]
Gradle「4.DSLはGroovyでいいよね?」
ぼく「うん」
Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4]
Gradle「5.テスト用のFWはJupiter(JUnit5)でいいよね?」
ぼく「うん」
Project name (default: GradlePracticeApp):
Gradle「6.プロジェクト名はディレクトリ名でいいよね?」
ぼく「うん」
Source package (default: gradlepracticeapp):
Gradle「7.ソースパッケージもディレクトリ名でいいよね?」
ぼく「うん」
以上です。
【横道】basic選んでもいい?
PS C:\pleiades\workspace\GradlePracticeBasic> gradle init
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4]
Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2]
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]
Project name (default: GradlePracticeBasic):
> Task :init
Get more help with your project: Learn more about Gradle by exploring our samples at https://docs.gradle.org/7.6/samples
BUILD SUCCESSFUL in 8s
2 actionable tasks: 2 executed
PS C:\pleiades\workspace\GradlePracticeBasic>
以下の通りbasicは「自分で一通りできるぜ」って人向けの指定なので、この記事の対象読者的には2のapplicationがベターです。
ちなみにbasicのbuild.gradleの中身はコメントだけです。
Eclipseにプロジェクトをインポートする
※2024/06/07追記
以下、大枠としては変更ありませんが、
古い情報が表示されていることがあります。
-
Gradleプロジェクトのインポート
プロジェクト・ルート・ディレクトリーをC:\pleiades\workspace\GradlePracticeApp
に設定 > 次へ
-
インポートされたことを確認
下図のようになれば成功です。
もし「Gradleタスク」タブが表示されていない場合、
ツールバー > ウィンドウ > ビューの表示 > Gradleタスク
で表示することができます。
build.gradleを編集
初期化された状態のbuild.gradle(からコメントを抜いたもの)は以下の通りです。
plugins {
id 'application'
}
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'
implementation 'com.google.guava:guava:31.1-jre'
}
application {
mainClass = 'gradlepracticeapp.App'
}
tasks.named('test') {
useJUnitPlatform()
}
これでもビルドやテストはできますが、折角なので色々追加しましょう。
特にここからは無知エリアが多いため、誤りやベタープラクティスがありましたら是非教えてほしいです。
plugins
第21章 Gradleのプラグインについて
プラグインを適用することで、様々なタスクを使えるようになります。
// 古い書き方
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'
// 新しい書き方
plugins {
id 'java'
id 'eclipse'
id 'application'
}
一つ目は古い書き方で推奨されない1とのことなので、下の書き方を使いましょう。
何も記載しない場合に使えるタスクは以下の通り。
C:\pleiades\workspace\GradlePracticeApp>gradle tasks
> Task :tasks
------------------------------------------------------------
Tasks runnable from root project 'GradlePracticeApp'
------------------------------------------------------------
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'GradlePracticeApp'.
dependencies - Displays all dependencies declared in root project 'GradlePracticeApp'.
dependencyInsight - Displays the insight into a specific dependency in root project 'GradlePracticeApp'.
help - Displays a help message.
javaToolchains - Displays the detected java toolchains.
outgoingVariants - Displays the outgoing variants of root project 'GradlePracticeApp'.
projects - Displays the sub-projects of root project 'GradlePracticeApp'.
properties - Displays the properties of root project 'GradlePracticeApp'.
resolvableConfigurations - Displays the configurations that can be resolved in root project 'GradlePracticeApp'.
tasks - Displays the tasks runnable from root project 'GradlePracticeApp' (some of the displayed tasks may belong to subprojects).
To see all tasks and more detail, run gradle tasks --all
To see more detail about a task, run gradle help --task <task>
BUILD SUCCESSFUL in 728ms
1 actionable task: 1 executed
C:\pleiades\workspace\GradlePracticeApp>
全部見たい場合はgradle tasks --all
を叩いてください。
javaプラグインを適用すると使えるタスク一例。
全てを見る場合は 第23章 Javaプラグイン をご覧ください。
- compileJava
- jar
- javadoc
- test
- clean
eclipseプラグインを適用すると使えるタスク一例。
全てを見る場合は 第38章 Eclipse プラグイン をご覧ください。
- eclipse
- cleanEclipse
applicationプラグインを適用すると使えるタスク一例。
全てを見る場合は 第45章 アプリケーション プラグイン をご覧ください。
- run
- installApp
- distZip
repositories
第7章 Javaクイックスタート
dependenciesに外部ライブラリなどの依存関係を記載した場合、repositoriesから持ってきます。
取得の優先順位は記載した定義順だそうです2。
Javaプロジェクトは外部のJARファイルに依存することが普通です。
プロジェクトで使うこういったJARファイルを参照するため、Gradleにそれらの場所を伝える必要があります。
※引用元:7.2.2. External dependencies
mavenCentral()
と書けばMaven Centralから持ってきてくれます。
バージョン違い含め現在3126万を超えるパッケージがあるため、私的利用であればここでほぼ賄えるように感じますね。
必要なライブラリを検索する場合はMaven Repositoryを使うと便利です。
jcenter()
などもありますが、入門的に勉強するだけならrepositoriesの変更は不要でしょう。
dependencies
第8章 依存関係管理の基本
ここには自作・外部を問わず、依存するライブラリやフレームワークを記載します。
試しにtestImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'
と同じものを拾ってきてみましょう。
-
Maven Repositoryでjunit-jupiterを検索し、
1.JUnit Jupiter API
を選択
-
Gradle(Short)タブを選択し、表示されたコードをbuild.gradleにコピペする
Gradle
タブを選んだ場合は省略なしの記述が出てきますが、どちらを選択しても同じです。
// Gradle(short)
// https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.1'
// Gradle
// https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.9.1'
application
plugins
に id 'application'
を記載した場合、applicationが持つrunタスクで参照される項目です。
メインクラスを指定してください。
実際に試してみます。
C:\pleiades\workspace\GradlePracticeApp>gradle run
> Task :app:run
Hello World!
BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed
C:\pleiades\workspace\GradlePracticeApp>
上手くいきました。
実行するメソッド名を変えてもう一つ試してみます。
package gradlepracticeapp;
public class Hoge {
public static void main(String[] args) {
System.out.println("Hello, Hoge!!");
}
}
// ここだけ書き換えた
application {
mainClass = 'gradlepracticeapp.Hoge'
}
C:\pleiades\workspace\GradlePracticeApp>gradle run
> Task :app:run
Hello, Hoge!!
BUILD SUCCESSFUL in 960ms
2 actionable tasks: 2 executed
C:\pleiades\workspace\GradlePracticeApp>
実行時に動くメソッドがちゃんと変わりました。
tasks.named('test')
第15章 タスク詳解
testタスクに必要な設定を記載します。
今回はJupiter(JUnit5)を利用するため、useJUnitPlatform()
と記載します。
これがないとtestタスク時に上手くテスト結果レポートが出力されません。
出力パスは \GradlePracticeApp\app\build\reports\tests\test\
の index.html
です。
よく使うタスク
-
build
ビルドを行います。正確には
compileJava > processResources > classes > jar > assemble > compileTestJava > processTestResources > testClasses > test > check > build
の順で行い、フルビルドを行います。 -
clean
buildディレクトリ以下を削除します。 -
test
テストを行います。 -
dependencies
ライブラリの依存関係を一覧にして出力します。
これらを組み合わせて gradle clean build -x test
と言ったような使い方もできます。
詳しくは公式ページや他の記事をご覧ください。
最後に
自分は執筆前「Gradle読めるけど書けない」状態でしたが、「書けるような気がしてきた」程度になる事ができました。
誤りの指摘、疑問などのコメント是非お待ちしております。
さて、このページが概ね理解できたら入門記事を読みましょうね。この記事は入門してもいない。