Java + Gradle + IntelliJ + Spring BootでHello World! 

タイトルの通り，Java + Gradle + IntelliJ + Spring Boot という組み合わせで Hello World! を表示する方法を紹介します．

PCはWindowsで，コマンドプロンプトかGit Bashを使う想定です．
各項目を1行で書くと，以下のような説明になります．
* Java: オブジェクト指向プログラミング言語．プラットフォームに依存せず動作する
* Gradle: ビルド自動化ツール．依存関係管理やタスク実行を効率化する
* IntelliJ: JetBrainsが開発した高機能なJava向けIDE．開発支援ツールが充実
* Spring Boot: JavaのWebアプリ開発を簡単にするフレームワーク．最小設定で動作
* Hello World!: プログラミングの基本．画面に「Hello, World!」を表示するサンプルコード

# Java
### 1. Javaのインストール確認
```:コマンドプロンプト
>javac -version
'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```
```bash:Git Bash
$ javac -version
bash: javac: command not found
```
### 2. ARM64 or x64 (=AMD64)の確認
```:コマンドプロンプト
>echo %PROCESSOR_ARCHITECTURE%
AMD64
```
```bash:Git Bash
$ echo $PROCESSOR_ARCHITECTURE
AMD64
$ arch
x86_64
```
### 3. 以下のサイトから，Javaをインストール

https://www.oracle.com/java/technologies/downloads/

ダウンロードした`jdk-23_windows-x64_bin.exe`を実行．ガイドに従う．

### 4.  Javaのインストール確認
```:コマンドプロンプト
>javac -version
javac 23.0.2
```
```bash:Git Bash
$ javac -version
javac 23.0.2
```
### 5.  JavaでHello World! (+ファイル確認)
```:コマンドプロンプト
>echo class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); } } > hello.java
>javac hello.java
>java Hello
Hello, World!

>dir /B
Hello.class
hello.java
```
```bash:Git Bash
$ echo 'class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); } }' > hello.java
$ javac hello.java
$ java Hello
Hello, World!

$ ls
Hello.class  hello.java
```

# Gradle
### 1. Gradleのインストール確認
```:コマンドプロンプト
>gradle -v
'gradle' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```
```bash:Git Bash
$ gradle -v
bash: gradle: command not found
```
### 2. 以下のサイトから，Gradleをインストール

https://gradle.org/install/

ダウンロードした`gradle-8.13-bin.zip`を展開．
展開した`gradle-8.13`を`C:\Gradle`に配置．
`C:\Gradle\gradle-8.13\bin` を環境変数に設定（pathを通す）．

### 3.  gradleのインストール確認
```:コマンドプロンプト
>gradle -v
------------------------------------------------------------
Gradle 8.13
------------------------------------------------------------
```
```bash:Git Bash
$  gradle -v
------------------------------------------------------------
Gradle 8.13
------------------------------------------------------------
```
### 4.  gradleでHello World!
```:コマンドプロンプト (gradle init)
>mkdir Gradle
>cd Gradle
>gradle init

Select type of build to generate:
  1: Application
  2: Library
  3: Gradle plugin
  4: Basic (build structure only)
Enter selection (default: Application) [1..4]

Select implementation language:
  1: Java
  2: Kotlin
  3: Groovy
  4: Scala
  5: C++
  6: Swift
Enter selection (default: Java) [1..6]

Enter target Java version (min: 7, default: 21):

Project name (default: Gradle):

Select application structure:
  1: Single application project
  2: Application and library project
Enter selection (default: Single application project) [1..2]

Select build script DSL:
  1: Kotlin
  2: Groovy
Enter selection (default: Kotlin) [1..2]

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4]

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]

> Task :init
Learn more about Gradle by exploring our Samples at https://docs.gradle.org/8.13/samples/sample_building_java_applications.html

BUILD SUCCESSFUL in 20s
1 actionable task: 1 executed
```
```:コマンドプロンプト (gradle run)
>gradle run
Calculating task graph as no cached configuration is available for tasks: run

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed
Configuration cache entry stored.
```
```bash:Git Bash (gradle init)
$ mkdir Gradle
$ cd Gradle
$ gradle init

Select type of build to generate:
  1: Application
  2: Library
  3: Gradle plugin
  4: Basic (build structure only)
Enter selection (default: Application) [1..4]

Select implementation language:
  1: Java
  2: Kotlin
  3: Groovy
  4: Scala
  5: C++
  6: Swift
Enter selection (default: Java) [1..6]

Enter target Java version (min: 7, default: 21):

Project name (default: Gradle):

Select application structure:
  1: Single application project
  2: Application and library project
Enter selection (default: Single application project) [1..2]

Select build script DSL:
  1: Kotlin
  2: Groovy
Enter selection (default: Kotlin) [1..2]

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4]

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]

> Task :init
Learn more about Gradle by exploring our Samples at https://docs.gradle.org/8.13/samples/sample_building_java_applications.html

BUILD SUCCESSFUL in 11s
1 actionable task: 1 executed
```
```bash:Git Bash (gradle run)
$ gradle run
Calculating task graph as no cached configuration is available for tasks: run

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 4s
2 actionable tasks: 2 executed
Configuration cache entry stored.
```

# IntelliJ
### 1. 以下のサイトから，IntelliJ IDEA Community版をインストール
https://www.jetbrains.com/ja-jp/idea/download/?section=windows

### 2. IntelliJでHello World!
IntelliJを起動．
（`C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2024.3.3\bin`を実行）
新規プロジェクトを選択．ガイドに従う．
右上の▷ボタンかShift+F10を押すと，以下が表示される．
```bash:
19:38:23:  ':org.example.Main.main()' を実行中…

> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE

> Task :org.example.Main.main()
Hello and welcome!i = 1
i = 2
i = 3
i = 4
i = 5

BUILD SUCCESSFUL in 340ms
2 actionable tasks: 1 executed, 1 up-to-date
19:38:23:  ':org.example.Main.main()' の実行を完了しました。
```
`./src/main/java/org/example/Main.java`を書き換えると，`Hello World!`を表示できる．

# Spring Boot
※IntelliJ IDEA Uitimateの場合，新規プロジェクトのジェネレーターにSpringがある．

以下のサイトで適当な設定を選択し，GENERATEボタンを押してファイルをダウンロードする．

https://start.spring.io/

ダウンロードしたzipファイルを展開する．
展開先のディレクトリで以下のコマンドを実行する．
```:コマンドプロンプト
>.\gradlew.bat bootRun

> Task :bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.4.3)

BUILD SUCCESSFUL in 4s
4 actionable tasks: 4 executed
```
```bash:Git Bash
$ ./gradlew bootRun

> Task :bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.4.3)

BUILD SUCCESSFUL in 3s
4 actionable tasks: 1 executed, 3 up-to-date
```
`./src/main/java/com/example/demo/DemoApplication.java`を書き換えると，Hello World!を表示できる．

# Java + Gradle + IntelliJ + SpringbootでHello World!
https://start.spring.io/

上記サイトで以下の設定を選択し，GENERATEボタンを押してファイルをダウンロードする．
* Project: Gradle - Groovy
* Language: Java
* Dependencies: Spring Web


ダウンロードしたzipファイルを展開する．
IntelliJで展開先の`build.gradle`をプロジェクトとして開く．
右下に表示される処理が終了するまで，待機する．
`./src/main/java/com/example/demo/DemoApplication.java`を以下のように書き換える．
```java:DemoApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {
    public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
    }
    @GetMapping("/hello")
    public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
      return String.format("Hello %s!", name);
    }
}
```
右上の▷ボタンかShift+F10を押す．
ブラウザで`http://localhost:8080/hello`にアクセスする．
（ブラウザで`http://localhost:8080/hello?name=Amy`にもアクセスしてみる）

# 終わりに
Java + Gradle + IntelliJ + Spring Boot という組み合わせで Hello World! を表示する方法を紹介しました．
この組み合わせは，Javaの標準的なツールセットの１つのようです．
これから，勉強を頑張ります．