初心者だけどGradleをEclipseで使いたい！

[^1]:https://www.web-dev-qa-db-ja.com/ja/groovy/gradle%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AE%E9%81%95%E3%81%84/1056004156/
[^2]:https://qiita.com/tenten0213/items/41cd8eb0a3fce121095c

:::note warn
__※2024/06/07追記__
コメントで誤記についてのご指摘をいただき、
一部画像の差し替えや誤記修正を行いました。
:::

初めまして、堀井です。

ブログは色々書いてきたもののQiitaは初めてなのでお手柔らかにお願いします。

さて、プログラムを色々書いているとビルドツールにも手を出したくなりますよね。
Javaのビルドツールと言えば[Ant](https://ant.apache.org/), [Maven](https://maven.apache.org/), [Gradle](https://gradle.org/)などがありますが、今回はGradleを勉強したいなと思って調べたまとめです。
実務でMavenのシェアが高いことは承知していますが、私的利用に限れば新規にMavenを学び始める理由も薄いかなと。

では早速行きましょう。

:::note info
**この記事が対象としている読者**
・Javaでメソッドを作ることができる
・Eclipseで開発したことがある
・Ant, Maven, Gradleと言う名前を聞いたことがある
・Gradleの知識は「ビルドツールである」くらいしか知らない
・「ビルドツールは便利らしい」と言うことを知っている
:::
- - -
# ツールのダウンロード
まずはツールのダウンロードを行います。
PleaidesとGradleをそれぞれ最新版にしましょう。

## Pleaides All in One Eclipse
[Pleiades All in One Eclipse ダウンロード](https://willbrains.jp/)
　
Eclipse本体に日本語化プラグインと言語別に便利なプラグインが入った、言わずと知れたIDE（統合開発環境）です。
赤枠の最新版を選んでください（記事更新日現在の最新は`v20240325`）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/6d4c389a-be3c-029f-b2ed-942f0cf1f887.png)


[Buildship](https://projects.eclipse.org/projects/tools.buildship)が入っている **Ultimate** または **Java** を選択してください。
BuildshipとはGradle用のEclipseプラグインです。もちろん別途マーケットプレースからインストールしてもいいですが、どうせJavaを使うしわざわざ付属していない物を選ぶ理由もないと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/a97729c1-1efa-caef-bb13-475530607f31.png)

## Gradle
[Gradle](https://gradle.org/)
Eclipse同様に最新版をダウンロードします（記事更新日現在の最新は`8.8`）。

### `1. Install Gradle X.X`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/434eb80c-cb45-554a-054f-19f07ba8a9e8.png)

### `Installing manually`からバイナリファイルをダウンロードして解凍
画面中央辺りにあります。見つからない場合はctrl + Fでページ内検索を。
ユーザマニュアルやAPI Javadocが必要な方はCompleteをダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/f7904fdb-fe61-39ba-c754-50959d5e972c.png)

### `C:\Gradle`に解凍したファイルを配置
ディレクトリが無い方は作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/0407d651-a5ae-c56c-3e5d-f043f7bc70a4.png)

### システム環境変数を設定
環境設定画面で`GRADLE_HOME`のPATHを、Gradleを配置したパス`C:\Gradle\gradle-8.8`に指定します。
同様に`Path`のPATHに`%GRADLE_HOME%\bin`を追加します。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079716/836c0bf4-a3d7-4176-33c1-fce3de68bb2c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/049c9d8e-18fd-20b7-cdfb-8b122f4901ac.png)
![008-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/8a9b29d1-c032-85a0-bf6b-ff9baaaf8f00.png)

### 使用可能になったことを確認
Powershell（またはコマンドプロンプトやGit-BashなどのCUIツール）を開き`gradle -v`を叩きます。
以下のようなメッセージが表示されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/33103a7e-2f8f-ec31-055c-fa614e6d9316.png)
　
上手くいかない方はこれまでの操作に間違いないことを確認してください。
* 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`とします。
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079716/cb07fec4-f004-a101-cb1e-9ed9d890276c.png)

## CLIを起動して、プロジェクトを作成する
`gradle init`を叩きます。
10秒も待つと選択肢が出てくるので「1つ目だけ2、残りはデフォルト（Enter押すだけ）」としていきます。
```terminal
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>
```
　
あまりにも味気ないので補足。
```terminal
Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4]
```
Gradle「1.基本プロジェクトでいいよね？」
ぼく「やだ、アプリ作りたい。」
　
```terminal
Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6]
```
Gradle「2.言語はJavaでいいよね？」
ぼく「うん」
　
```terminal
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.機能分割しないよね？」
ぼく「うん」
　
```terminal
Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2]
```
Gradle「4.DSLはGroovyでいいよね？」
ぼく「うん」
　
```terminal
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）でいいよね？」
ぼく「うん」
　
```terminal
Project name (default: GradlePracticeApp):
```
Gradle「6.プロジェクト名はディレクトリ名でいいよね？」
ぼく「うん」
　
```terminal
Source package (default: gradlepracticeapp):
```
Gradle「7.ソースパッケージもディレクトリ名でいいよね？」
ぼく「うん」
　
以上です。
　
### 【横道】basic選んでもいい？
```terminal
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の中身はコメントだけです。
![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079716/6420d70f-381e-5a4f-292a-e09f616d9255.png)
　
## Eclipseにプロジェクトをインポートする
:::note warn
__※2024/06/07追記__
以下、大枠としては変更ありませんが、
古い情報が表示されていることがあります。
:::
1. Eclipseを起動して、エクスプローラ上で右クリック > インポート
![012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/b4f404a1-52fb-883e-ad25-a1df7e52469b.png)

2. インポート・ウィザードの選択
Gradle > 既存のGradleプロジェクト > 次へ
![013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/601fa936-49c9-ddff-3e2c-f8f2edf2b149.png)

3. Gradleプロジェクトのインポート
プロジェクト・ルート・ディレクトリーを`C:\pleiades\workspace\GradlePracticeApp` に設定 > 次へ 
![014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/cd50a324-a9ec-b870-ca67-7c3223116e7e.png)

4. インポート・オプション
設定変更なし > 次へ
![015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/668a03cb-7858-9450-ee92-aaae8ecfdac1.png)

5. インポ－ト・プレビュー
問題ないことを確認 > 完了
![016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/1c9dbc96-868c-489b-efc3-0016561aad11.png)

6. インポートされたことを確認
下図のようになれば成功です。
![017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/e56dc263-44bb-b5de-e126-6549ebb23338.png)
もし「Gradleタスク」タブが表示されていない場合、
ツールバー > ウィンドウ > ビューの表示 > Gradleタスク
で表示することができます。
![018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/c4aa88db-0781-855d-de05-7374aa4c6af9.png)

## build.gradleを編集
初期化された状態のbuild.gradle（からコメントを抜いたもの）は以下の通りです。
```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のプラグインについて](http://gradle.monochromeroad.com/docs/userguide/plugins.html)
プラグインを適用することで、様々なタスクを使えるようになります。
```gradle:build.gradle
// 古い書き方
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'

// 新しい書き方
plugins {
    id 'java'
    id 'eclipse'
    id 'application'
}
```
一つ目は古い書き方で推奨されない[^1]とのことなので、下の書き方を使いましょう。
何も記載しない場合に使えるタスクは以下の通り。
```terminal
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プラグイン](http://gradle.monochromeroad.com/docs/userguide/java_plugin.html) をご覧ください。
* compileJava
* jar
* javadoc
* test
* clean
　

eclipseプラグインを適用すると使えるタスク一例。
全てを見る場合は [第38章 Eclipse プラグイン](http://gradle.monochromeroad.com/docs/userguide/eclipse_plugin.html) をご覧ください。
* eclipse
* cleanEclipse
　

applicationプラグインを適用すると使えるタスク一例。
全てを見る場合は [第45章 アプリケーション プラグイン](http://gradle.monochromeroad.com/docs/userguide/application_plugin.html) をご覧ください。
* run
* installApp
* distZip

### repositories
[第7章 Javaクイックスタート](http://gradle.monochromeroad.com/docs/userguide/tutorial_java_projects.html)
dependenciesに外部ライブラリなどの依存関係を記載した場合、repositoriesから持ってきます。
取得の優先順位は記載した定義順だそうです[^2]。
> Javaプロジェクトは外部のJARファイルに依存することが普通です。
> プロジェクトで使うこういったJARファイルを参照するため、Gradleにそれらの場所を伝える必要があります。
> ※引用元：[7.2.2. External dependencies](http://gradle.monochromeroad.com/docs/userguide/tutorial_java_projects.html)

`mavenCentral()`と書けば[Maven Central](https://central.sonatype.dev/)から持ってきてくれます。
バージョン違い含め現在3126万を超えるパッケージがあるため、私的利用であればここでほぼ賄えるように感じますね。
必要なライブラリを検索する場合は[Maven Repository](https://mvnrepository.com/)を使うと便利です。

`jcenter()` などもありますが、入門的に勉強するだけならrepositoriesの変更は不要でしょう。

### dependencies
[第8章 依存関係管理の基本](http://gradle.monochromeroad.com/docs/userguide/artifact_dependencies_tutorial.html)
ここには自作・外部を問わず、依存するライブラリやフレームワークを記載します。
試しに`testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'`と同じものを拾ってきてみましょう。

1. [Maven Repository](https://mvnrepository.com/)でjunit-jupiterを検索し、`1.JUnit Jupiter API`を選択
![019.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/a09b1b30-a71e-6612-365e-dc1293652872.png)

2. 最新バージョンを選択
![020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/45ebf639-048d-b9b4-743a-844f42401303.png)

3. Gradle(Short)タブを選択し、表示されたコードをbuild.gradleにコピペする
![021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/37da1198-bf06-990b-e722-7e1e1313f670.png)
`Gradle` タブを選んだ場合は省略なしの記述が出てきますが、どちらを選択しても同じです。
```gradle:build.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タスクで参照される項目です。
メインクラスを指定してください。
![021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/5dfb0792-3670-8e4d-fd6c-c759c88d3cf5.png)

実際に試してみます。
```terminal
C:\pleiades\workspace\GradlePracticeApp>gradle run

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed
C:\pleiades\workspace\GradlePracticeApp>
```
上手くいきました。
実行するメソッド名を変えてもう一つ試してみます。
```java:Hoge.java（新規作成）
package gradlepracticeapp;

public class Hoge {
  
  public static void main(String[] args) {
    System.out.println("Hello, Hoge!!");
  }
}
```
```gradle:build.gradle（一部）
// ここだけ書き換えた
application {
    mainClass = 'gradlepracticeapp.Hoge'
}
```
```terminal
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章 タスク詳解](http://gradle.monochromeroad.com/docs/userguide/more_about_tasks.html)
testタスクに必要な設定を記載します。
今回はJupiter（JUnit5）を利用するため、`useJUnitPlatform()` と記載します。
これがないとtestタスク時に上手くテスト結果レポートが出力されません。
出力パスは `\GradlePracticeApp\app\build\reports\tests\test\` の `index.html` です。

折角なので試してみました。
**コメントアウトした場合**
![022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/fe7ac5e8-b0e7-555b-eb5c-e5035efd4afe.png)

**記載した場合**
![023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/8863dee9-5256-e4a1-5652-f6fc8704e766.png)

# よく使うタスク
* build
ビルドを行います。正確には
compileJava > processResources > classes > jar > assemble > compileTestJava > processTestResources > testClasses > test > check > build
の順で行い、フルビルドを行います。

* clean
buildディレクトリ以下を削除します。

* test
テストを行います。

* dependencies
ライブラリの依存関係を一覧にして出力します。

これらを組み合わせて `gradle clean build -x test`と言ったような使い方もできます。
詳しくは公式ページや他の記事をご覧ください。
- - -
# 最後に
自分は執筆前「Gradle読めるけど書けない」状態でしたが、「書けるような気がしてきた」程度になる事ができました。
　
誤りの指摘、疑問などのコメント是非お待ちしております。
　
さて、このページが概ね理解できたら入門記事を読みましょうね。この記事は入門してもいない。

http://gradle.monochromeroad.com/docs/userguide/userguide.html

https://qiita.com/vvakame/items/83366fbfa47562fafbf4

https://qiita.com/hatimiti/items/a127311d739c9d3e0045

https://zenn.dev/niharu/scraps/50417872441407