Eclipseからの脱却

## はじめに
java初心者でEclipseでしかコードを書いたことがないので、Eclipseからの脱却を図るのが目的です。
今回はCLIでSpring Bootアプリを作って動かしてみます。
以下は生成AI(chatgpt)で確認し進めています。

## 目標
**Eclipseを使わず、MavenとCLIで最小限のSpring Bootアプリを作って動かす** ことが目標です。


## 前提

- Java 17 など JDK がインストールされている（`java -version`で確認）
- Maven がインストールされている（`mvn -v` で確認）


## 🛠 Step 1-1: Spring Boot プロジェクトの雛形を作成

一番簡単な方法は [https://start.spring.io/](https://start.spring.io/) からダウンロードする方法です。

もしくは、以下のコマンドでも作れます（Maven archetypeを使う方法もありますが、ここではstart.spring.ioベースを推奨します）。

### 方法1: `curl` で直接 zip を取得

```bash
curl https://start.spring.io/starter.zip \
  -d dependencies=web \
  -d name=demoapp \
  -d type=maven-project \
  -d language=java \
  -d bootVersion=3.2.3 \
  -d baseDir=demoapp \
  -o demoapp.zip

unzip demoapp.zip
cd demoapp
```

> もしくは手動で https://start.spring.io/ にアクセスし、次のように選択して ZIP をダウンロード：
>
> - Project: Maven
> - Language: Java
> - Spring Boot: 3.2.x
> - Dependencies: Web
> - Group: `com.example`
> - Artifact: `demoapp`

### 実際の対応
curlを動かすにあたり、Windows11を使用しておりWSL上でセットを試みました。
しかしながらcurlで試しましたがzipのダウンロードができませんでした、なぜかmavenでなくgradleになる、色々試しましたが結局できず手動でアクセスしてzipを取得しました。wsl上なのでjavaのセット等行いました。

```
xxxxxx@DESKTOP-V4DBQTD:/mnt/c/Users/apple/Downloads/demoappmaven$ sudo apt install openjdk-17-jdk
Reading package lists... Done
Building dependency tree
Reading state information... Done
```

ちなみに手動での画面は以下にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176603/873d03d6-2d4a-42fa-b10c-3239070607b1.png)


はい、まさにおっしゃる通りです！💯  
**Windows の Java 設定 (`C:\Program Files\...`) と、WSL（Ubuntu）の Java 設定は完全に別物です。**

---

## 補足

- **Windows側の `java -version` → Windows にインストールされた Java を見ている**
- **WSL側の `java -version` → Ubuntu のパス上に Java がなければ "Command not found"**

つまり、当たり前だが**WSL 上で Spring Boot を動かしたければ、WSL 内部に Java をインストールする必要がある**。

---

## ✅ WSL に Java を入れる（penJDK 17）

Spring Boot 3.x は **Java 17以上** が推奨なので、Ubuntuに以下のようにインストールします：

```bash
sudo apt update
sudo apt install openjdk-17-jdk
```

---

## ✅ 確認（WSL内で）

```bash
java -version
```

出力例：

```bash
openjdk version "17.0.x" ...
```

---

## ✅ `JAVA_HOME` の設定（WSL用）

```bash
readlink -f $(which java)
```

例：`/usr/lib/jvm/java-17-openjdk-amd64/bin/java`

その後、以下を実行：

```bash
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
```



## Spring Boot 起動

```bash
cd /mnt/c/Users/sawada/Downloads/demoappmaven
./mvnw spring-boot:run
```

 これで WSL 環境でも Spring Boot アプリが立ち上がる。


## 🛠 Step 1-2: アプリをビルドする

```bash
cd demoapp
mvn clean package
```

正常にビルドされると、`target/demoapp-0.0.1-SNAPSHOT.jar` ができます。

---

## 🛠 Step 1-3: アプリを実行する

```bash
java -jar target/demoapp-0.0.1-SNAPSHOT.jar
```

起動に成功すれば、以下のようなログが表示され、Spring Boot がポート 8080 で起動します：

```
Tomcat started on port(s): 8080 (http) with context path ''
Started DemoappApplication in 2.345 seconds (JVM running for 2.789)
```

ブラウザで以下にアクセスして確認してみてください：

[http://localhost:8080/](http://localhost:8080/)

最初はコントローラ未実装のため、以下の画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176603/47bf5039-eff0-4326-b9b3-6b82515e5e47.png)


以下の2つは、**最終的に同じ目的（アプリの実行）を達成しますが、プロセスに少し違いがあります。**


## ✅ 比較：2つの方法の違いと共通点

| 実行方法 | 説明 |
|----------|------|
| `./mvnw spring-boot:run` | Maven の **Spring Boot プラグイン**を使って直接アプリを起動<br>→ **ビルドと起動を一発で実行**する開発向けのコマンド |
| `mvn clean package` → `java -jar target/xxx.jar` | アプリを一度 **パッケージング（jar化）** してから、**明示的に jar を実行**<br>→ 本番環境やデプロイ時に使う構成に近い |

---

## ✅ 両者の違いをもう少し詳しく

| 比較ポイント | `spring-boot:run` | `mvn package` → `java -jar` |
|---------------|-------------------|-----------------------------|
| 実行速度       | やや速い（ビルド後すぐ実行） | フルビルドが入るため一手間あり |
| jarファイル生成 | ❌ 生成されない             | ✅ `target/xxx.jar` ができる |
| 利用シーン       | 開発時のテスト起動に便利     | 本番配備や配布用ビルドに適する |
| 依存解決       | 内部的に Maven が解決       | `mvn clean install` で明示的に依存解決 |

---

## ✅ 実際の流れ（Maven手順）

```bash
mvn clean package
java -jar target/demoapp-0.0.1-SNAPSHOT.jar
```

これは、アプリを jar にまとめてから実行する形式で、Docker やサーバーにデプロイするときなどに使います。

## ✅ まとめると…

> ✅ **`./mvnw spring-boot:run` は開発用ショートカット**  
> ✅ **`mvn package` → `java -jar` は本番用ビルド手順**


---

## 🧪 Step 1-4: 簡単なAPIを追加してみる（`HelloController`）

```bash
# src/main/java/com/example/demoapp/HelloController.java を作成

package com.example.demoapp;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
  @GetMapping("/hello")
  public String hello() {
    return "Hello from Spring Boot!";
  }
}
```

保存後、再度ビルド＆実行：

```bash
mvn clean package
java -jar target/demoapp-0.0.1-SNAPSHOT.jar
```

次にブラウザでアクセス：

[http://localhost:8080/hello](http://localhost:8080/hello)

→ `"Hello from Spring Boot!"` と表示されれば成功です！


```
dotinstall@DESKTOP-V4DBQTD:/mnt/c/Users/apple/Downloads/demoappmaven$ java -jar target/demoappmaven-0.0.1-SNAPSHOT.jar

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

 :: Spring Boot ::                (v3.4.4)

2025-03-23T16:15:33.028+09:00  INFO 9626 --- [demoappmaven] [           main] c.e.d.DemoappmavenApplication            : Starting DemoappmavenApplication v0.0.1-SNAPSHOT using Java 17.0.14 with PID 9626 (/mnt/c/Users/apple/Downloads/demoappmaven/target/demoappmaven-0.0.1-SNAPSHOT.jar started by dotinstall in /mnt/c/Users/sawada/Downloads/demoappmaven)
2025-03-23T16:15:33.031+09:00  INFO 9626 --- [demoappmaven] [           main] c.e.d.DemoappmavenApplication            : No active profile set, falling back to 1 default profile: "default"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176603/3dc98847-6eb6-41dd-b2be-5b7c1cb3b0f0.png)



上記コードはVS Codeで記載しています。`code .` で立ち上げています。
`code .` は **VS Code（Visual Studio Code）を起動するための公式コマンド** です。

## ✅ `code .` とは？

| コマンド    | 意味                                         |
|-------------|----------------------------------------------|
| `code`      | VS Code を起動するコマンドラインツール       |
| `.`（ドット） | 「現在のディレクトリ」を意味する（カレント） |

なので、`code .` は：

> **「現在のディレクトリを VS Code で開く」**

という意味になります。


## ✅ 使い方の例（WSL上でもOK）

```bash
cd /mnt/c/Users/apple/emoappmaven
code .
```
該当プロジェクトでcode .を実行。
これで `demoappmaven` プロジェクトが VS Code で開きます。


## ✅ WSL 上で `code .` が使える理由

WSL に `code` コマンドが入っているのは、**Windows 側の VS Code が WSL と連携する機能（Remote - WSL 拡張機能）**を提供してくれているからです。

初回起動時に自動でインストールされることが多いので、意識せずに使えるようになります。


## ✅ 補足：VS Code 上で Spring Boot を快適に使うには？

- Java Extension Pack（by Microsoft）
- Spring Boot Extension Pack（by Pivotal / VMware）
- Lombok Extension（必要であれば）

などを入れます。



##  まとめ

> ✅ `code .` は「このフォルダを VS Code で開いて」とお願いしているコマンド  
> ✅ VS Code が WSL と連携できているからこそ、WSL のディレクトリでも使える




## fat jarについて
jar tf target/demoappmaven-0.0.1-SNAPSHOT.jarにより、**どのclassを使用しているかがわかる**。
```
xxxx@DESKTOP-V4DBQTD:/mnt/c/Users/sawada/Downloads/demoappmaven$ jar tf target/demoappmaven-0.0.1-SNAPSHOT.jar
META-INF/
META-INF/MANIFEST.MF
META-INF/services/
META-INF/services/java.nio.file.spi.FileSystemProvider
org/
org/springframework/
org/springframework/boot/
org/springframework/boot/loader/
org/springframework/boot/loader/jar/
org/springframework/boot/loader/jar/JarEntriesStream$InputStreamSupplier.class
org/springframework/boot/loader/jar/JarEntriesStream.class
org/springframework/boot/loader/jar/ManifestInfo.class
org/springframework/boot/loader/jar/MetaInfVersionsInfo.class
org/springframework/boot/loader/jar/NestedJarFile$JarEntriesEnumeration.class
・・・
```


### fat jar とは？

- **アプリケーション本体 + 依存ライブラリ** がすべて 1 つの `.jar` ファイルにパッケージされているものです。
- Spring Boot ではデフォルトで fat jar を作成します（`spring-boot-maven-plugin` を使っている場合など）。


### どのクラスが含まれているかについて

`jar tf` コマンドで出力された一覧は、**jar 内に含まれているすべてのクラスファイル**やリソースファイルを示します。これは：

- 自作クラス（あなたが書いたアプリケーションのコード）
- Spring Boot の内部クラス
- 使用しているライブラリ（例えば Jackson、Hibernate など）

を含んでいます。

### まとめ

- これは fat jar です。
- `org/springframework/boot/loader/` が含まれているのが明確な証拠です。
- `jar tf` の出力は、どのクラスが含まれているかを漏れなく確認する手段として使えます。



## おわりに
単純な環境構築ですが、少しずつ進めてみたいため記録として記載させて頂きました。