はじめに
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/ からダウンロードする方法です。
もしくは、以下のコマンドでも作れます(Maven archetypeを使う方法もありますが、ここではstart.spring.ioベースを推奨します)。
方法1: curl
で直接 zip を取得
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
はい、まさにおっしゃる通りです!💯
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に以下のようにインストールします:
sudo apt update
sudo apt install openjdk-17-jdk
✅ 確認(WSL内で)
java -version
出力例:
openjdk version "17.0.x" ...
✅ JAVA_HOME
の設定(WSL用)
readlink -f $(which java)
例:/usr/lib/jvm/java-17-openjdk-amd64/bin/java
その後、以下を実行:
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
Spring Boot 起動
cd /mnt/c/Users/sawada/Downloads/demoappmaven
./mvnw spring-boot:run
これで WSL 環境でも Spring Boot アプリが立ち上がる。
🛠 Step 1-2: アプリをビルドする
cd demoapp
mvn clean package
正常にビルドされると、target/demoapp-0.0.1-SNAPSHOT.jar
ができます。
🛠 Step 1-3: アプリを実行する
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)
ブラウザで以下にアクセスして確認してみてください:
以下の2つは、最終的に同じ目的(アプリの実行)を達成しますが、プロセスに少し違いがあります。
✅ 比較:2つの方法の違いと共通点
実行方法 | 説明 |
---|---|
./mvnw spring-boot:run |
Maven の Spring Boot プラグインを使って直接アプリを起動 → ビルドと起動を一発で実行する開発向けのコマンド |
mvn clean package → java -jar target/xxx.jar
|
アプリを一度 パッケージング(jar化) してから、明示的に jar を実行 → 本番環境やデプロイ時に使う構成に近い |
✅ 両者の違いをもう少し詳しく
比較ポイント | spring-boot:run |
mvn package → java -jar
|
---|---|---|
実行速度 | やや速い(ビルド後すぐ実行) | フルビルドが入るため一手間あり |
jarファイル生成 | ❌ 生成されない | ✅ target/xxx.jar ができる |
利用シーン | 開発時のテスト起動に便利 | 本番配備や配布用ビルドに適する |
依存解決 | 内部的に Maven が解決 |
mvn clean install で明示的に依存解決 |
✅ 実際の流れ(Maven手順)
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
)
# 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!";
}
}
保存後、再度ビルド&実行:
mvn clean package
java -jar target/demoapp-0.0.1-SNAPSHOT.jar
次にブラウザでアクセス:
→ "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"
上記コードはVS Codeで記載しています。code .
で立ち上げています。
code .
は VS Code(Visual Studio Code)を起動するための公式コマンド です。
✅ code .
とは?
コマンド | 意味 |
---|---|
code |
VS Code を起動するコマンドラインツール |
. (ドット) |
「現在のディレクトリ」を意味する(カレント) |
なので、code .
は:
「現在のディレクトリを VS Code で開く」
という意味になります。
✅ 使い方の例(WSL上でもOK)
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
の出力は、どのクラスが含まれているかを漏れなく確認する手段として使えます。
おわりに
単純な環境構築ですが、少しずつ進めてみたいため記録として記載させて頂きました。