Spring Bootでポート競合エラーが出た時の対処法

こんにちは。ゆうせいです。
Spring Bootアプリを起動したときに 「ポート競合エラー」Port already in use)が発生することがあります。

例えば、以下のようなエラーが出ることがあります。

org.springframework.boot.web.server.PortInUseException: Port 8080 is already in use

これは、Spring Bootがデフォルトでポート8080を使用するため、
他のアプリがすでに8080番ポートを使っていると競合してしまうからです。


1. 解決方法一覧

ポート競合エラーが出た場合、次の方法で解決できます。

(1) 別のポート番号を使う(推奨)
(2) 競合しているプロセスを特定して終了する
(3) Spring Bootをデフォルトのポートなしで起動する(ランダムポート使用)
(4) DockerやKubernetesを使っている場合、設定を見直す

それぞれの方法を詳しく解説していきます!


(1) 別のポート番号を使う(推奨)

方法①: application.properties で設定する

Spring Bootのポートを変更する最も簡単な方法は、
src/main/resources/application.properties に以下を追加することです。

server.port=8081

8081 に変更することで、他のアプリとポートが被らなくなります。


方法②: application.yml で設定する

もし application.yml を使っているなら、以下のように設定します。

server:
  port: 8081


方法③: コマンドラインオプションで変更する

Spring Bootを起動するときに、--server.port オプションを指定してポートを変更できます。

mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081"

または、JARファイルを直接実行するときに指定できます。

java -jar myapp.jar --server.port=8081


(2) 競合しているプロセスを特定して終了する

もしポート8080を使っている他のアプリが不要なら、
そのプロセスを特定して終了すればSpring Bootをそのまま起動できます。

方法①: Mac / Linux で使用中のポートを確認

以下のコマンドを実行すると、8080ポートを使っているプロセスID(PID)が分かります。

lsof -i :8080

結果(例):

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java     1234 user   50u  IPv6  0x1234      0t0  TCP *:http (LISTEN)

PID(1234) を使ってプロセスを強制終了できます。

kill -9 1234


方法②: Windowsで使用中のポートを確認

Windowsでは、以下のコマンドで8080ポートを使っているプロセスIDを調べます。

netstat -ano | findstr :8080

結果(例):

TCP    0.0.0.0:8080   0.0.0.0:0   LISTENING   5678

この場合、PIDは 5678 です。次のコマンドでプロセスを終了できます。

taskkill /PID 5678 /F


(3) ランダムポートを使う

毎回異なるポートでSpring Bootを起動したい場合、ランダムポートを使用できます。

方法①: application.properties に設定

server.port=0

この設定をすると、Spring Bootは利用可能なポートをランダムに選択して起動します。

起動後、ログに 「Tomcat started on port: XXXX」 のように出るので、ポート番号を確認できます。


方法②: コマンドラインでランダムポートを指定

java -jar myapp.jar --server.port=0


(4) DockerやKubernetesを使っている場合

DockerコンテナやKubernetesでSpring Bootを実行している場合、
ホストマシンとコンテナ間のポートマッピングが競合している可能性があります。

Dockerの設定を確認

Dockerでポート8080を使っている場合、docker ps で確認できます。

docker ps

結果(例):

CONTAINER ID   IMAGE   PORTS                    NAMES
abc123         myapp   0.0.0.0:8080->8080/tcp   myapp-container

もしポートを変更したいなら、docker-compose.yml で修正します。

services:
  app:
    image: myapp
    ports:
      - "8081:8080"  # ホストの8081 → コンテナの8080


5. まとめ(エラー解決の優先度)

方法詳細優先度
別のポートを指定するserver.port=8081 に変更⭐⭐⭐⭐(推奨)
競合プロセスを終了するlsof -i :8080 / taskkill でプロセスを強制終了⭐⭐⭐
ランダムポートを使うserver.port=0 で自動選択⭐⭐
Docker/K8sのポート設定を修正docker-compose.yml を修正

6. 最後に

Spring Bootのポート競合エラーはよくあるトラブルですが、
server.port を変更するのが最も簡単な解決方法 です。

server.port=8081

もし、どうしても 8080 を使いたい場合は、競合しているプロセスを特定して終了するのがベストです。

ポート競合に悩んだら、この方法を試してみてください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。