Dlaczego aplikacja Spring Boot nie startuje z powodu błędu port already in use

Marek Radoszewski Marek Radoszewski
Narzędzia i Praktyki
21.02.2026 12 min
Dlaczego aplikacja Spring Boot nie startuje z powodu błędu port already in use

Dlaczego aplikacja Spring Boot nie startuje?

Dlaczego aplikacja Spring Boot nie startuje i na konsoli pojawia się błąd „Port already in use”? To jedno z tych pytań, które potrafi skutecznie zepsuć rytm pracy podczas programowania. Szczególnie frustruje sytuacja, gdy jeszcze przed chwilą wszystko działało, a po kolejnym uruchomieniu aplikacja nagle odmawia współpracy.

Ten komunikat jest jednak bardzo konkretną wskazówką, a nie tajemniczą zagadką. Oznacza jedynie, że wybrany port jest już zajęty przez inny proces. W tym artykule zobaczysz krok po kroku, jak zdiagnozować problem, znaleźć proces blokujący port i skutecznie go rozwiązać, aby Twoja aplikacja Spring Boot znów mogła działać bez przeszkód.

W kolejnych sekcjach poznasz praktyczne komendy dla Windowsa, Linuxa i macOS, dowiesz się, jak zmienić port aplikacji oraz jak unikać podobnych problemów w przyszłości. Dzięki temu zamiast walczyć z infrastrukturą, będziesz mógł skupić się na pisaniu kodu.

Jeśli kiedykolwiek uruchamiałeś kilka aplikacji na lokalnym środowisku, prawdopodobnie już spotkałeś się z konfliktem portów. To naturalna konsekwencja pracy z wieloma narzędziami developerskimi i serwerami działającymi równolegle. Dobra wiadomość jest taka, że rozwiązania są proste i powtarzalne.

Najważniejsze jest zrozumienie, co dokładnie oznacza błąd „Port already in use” i jak działa mechanizm portów w systemie operacyjnym. Zacznijmy więc od podstaw, a potem przejdziemy do konkretnych technik diagnozy i naprawy problemu.

Schemat blokady portu 8080 przez inny proces, ilustrujący błąd Port already in use w aplikacji Spring Boot

Co oznacza błąd „Port already in use” w Spring Boot?

Aby dobrze zrozumieć, dlaczego aplikacja Spring Boot nie startuje, warto uporządkować pojęcie portu. Możesz wyobrazić sobie komputer jako duży blok mieszkalny, a działające procesy jako lokatorów. Każdy z nich potrzebuje własnego numeru mieszkania, aby odbierać „pocztę” i „paczki”, czyli dane oraz połączenia sieciowe.

Porty są właśnie takimi numerami mieszkań. W danym momencie tylko jeden proces może nasłuchiwać na konkretnym porcie, np. 8080. Gdy dwie aplikacje próbują działać na tym samym porcie, system nie pozwala na taki konflikt i jedna z nich nie może się uruchomić. W Spring Boot kończy się to komunikatem „Port already in use”.

Domyślnie większość aplikacji webowych Spring Boot uruchamia się na porcie 8080. Jest to standardowy i bardzo popularny port używany przez serwery aplikacyjne, narzędzia developerskie oraz inne usługi webowe. To sprawia, że jest on szczególnie narażony na konflikty.

Częstą przyczyną problemu jest pozostawiona w tle poprzednia instancja aplikacji lub innego serwera, który nie został poprawnie zatrzymany. System widzi, że port 8080 jest już zajęty, więc nowa instancja Spring Boot nie może rozpocząć nasłuchiwania. Z perspektywy systemu wszystko jest logiczne – nie ma sensu przydzielać tego samego adresu dwóm różnym procesom.

W kolejnych krokach zobaczysz, jak sprawdzić, który proces konkretnie zajmuje dany port. Znalezienie winowajcy jest kluczowe, aby skutecznie uwolnić port lub zdecydować się na zmianę konfiguracji aplikacji.

Jak zdiagnozować, co blokuje port w systemie Windows?

Pierwszym krokiem do rozwiązania błędu „Port already in use” jest zidentyfikowanie procesu, który zajmuje dany port. W systemie Windows zrobisz to szybko przy pomocy wbudowanych narzędzi, takich jak netstat i tasklist.

Krok 1: Uruchom CMD lub PowerShell jako administrator

Najpierw otwórz Wiersz Polecenia (CMD) lub PowerShell z uprawnieniami administratora. Wystarczy wpisać nazwę w wyszukiwarce Windows, kliknąć prawym przyciskiem myszy i wybrać opcję „Uruchom jako administrator”. Uprawnienia administratora są tutaj istotne, ponieważ niektóre informacje o procesach mogą być niedostępne dla zwykłego użytkownika.

Gdy konsola się otworzy, będziesz mógł wykonywać wszystkie potrzebne komendy diagnostyczne. To właśnie one pokażą Ci, który proces blokuje port potrzebny aplikacji Spring Boot.

Krok 2: Sprawdź zajęty port komendą netstat

Następnie wpisz w konsoli polecenie:

netstat -ano | findstr :8080

Jeśli problem dotyczy innego portu niż 8080, podmień go w komendzie na właściwy numer. Parametr -ano powoduje, że netstat wyświetla wszystkie aktywne połączenia i porty nasłuchujące wraz z identyfikatorem procesu (PID). findstr :8080 filtruje wynik, abyś widział tylko linie związane z danym portem.

W otrzymanym wyniku zwróć szczególną uwagę na ostatnią kolumnę. PID to właśnie numer procesu, który aktualnie używa wskazanego portu. Zanotuj ten identyfikator – za chwilę posłuży do sprawdzenia nazwy programu blokującego port.

Krok 3: Zidentyfikuj proces przy użyciu tasklist

Mając numer PID, możesz teraz sprawdzić, jaka aplikacja go używa. W tym celu wpisz komendę:

tasklist | findstr <NUMER_PID>

Oczywiście podmień <NUMER_PID> na wartość, którą wcześniej odczytałeś z wyniku netstat. Polecenie tasklist wyświetli nazwę procesu oraz dodatkowe informacje, takie jak ilość używanej pamięci. Bardzo często będą to procesy typu java.exe, tomcat.exe lub inne narzędzia serwerowe.

W ten sposób dokładnie widzisz, kto zajmuje port wymagany przez aplikację Spring Boot. Mając tę wiedzę, możesz zdecydować, czy zakończyć proces, czy raczej zmienić port w konfiguracji aplikacji.

Jak znaleźć proces blokujący port w Linux i macOS?

W systemach Linux i macOS diagnoza problemu „Port already in use” jest równie prosta, choć wykorzystuje inne narzędzia. Najczęściej stosuje się komendy lsof lub netstat, które pozwalają szybko dotrzeć do procesu trzymającego port.

Krok 1: Otwórz terminal

Na początek uruchom terminal w swoim systemie. Możesz skorzystać z domyślnej aplikacji Terminal lub dowolnego innego emulatora konsoli. Wszystkie dalsze polecenia będziesz wykonywać właśnie z poziomu wiersza poleceń.

Dobrą praktyką jest też upewnienie się, że masz wymagane uprawnienia – część komend może wymagać użycia sudo, aby wyświetlić pełne informacje o procesach działających w systemie.

Krok 2: Użyj lsof, aby sprawdzić port

Najbardziej precyzyjnym narzędziem jest często komenda:

lsof -i :8080

Tutaj również możesz podmienić numer portu na inny, jeśli Twoja aplikacja Spring Boot nasłuchuje na innym porcie niż 8080. lsof (List Open Files) pokazuje listę procesów, które otworzyły konkretne pliki lub gniazda sieciowe, w tym porty TCP i UDP.

W wyniku polecenia zobaczysz kolumny takie jak COMMAND i PID. COMMAND to nazwa procesu, natomiast PID to jego identyfikator. Ta para informacji wystarczy, abyś mógł rozpoznać, która usługa blokuje port potrzebny Twojej aplikacji.

Krok 3: Alternatywnie skorzystaj z netstat

Jeśli z jakiegoś powodu lsof nie jest dostępne lub wolisz inne narzędzie, możesz wykorzystać netstat:

sudo netstat -tulnp | grep :8080

Parametr -tulnp powoduje, że netstat wypisuje nasłuchujące porty TCP (t) i UDP (u), w formie numerycznej (n), wraz z informacją o procesie (p). grep :8080 filtruje wynik, by widoczne były jedynie linie związane z danym portem.

W rezultacie zobaczysz zarówno numer PID, jak i nazwę programu zajmującego wskazany port. Po zidentyfikowaniu procesu możesz zdecydować, czy powinien zostać zatrzymany, czy lepiej zmodyfikować port w konfiguracji Spring Boot.

Jak zakończyć proces blokujący port?

Jeśli już wiesz, jaki proces trzyma port, najprostszym rozwiązaniem błędu „Port already in use” jest zakończenie tego procesu. Trzeba jednak zachować ostrożność i upewnić się, że nie jest to kluczowa usługa systemowa lub coś, co jest Ci potrzebne do pracy.

Zakończenie procesu w systemie Windows

W systemie Windows do zakończenia procesu użyjesz komendy taskkill. Otwórz Wiersz Polecenia lub PowerShell jako administrator i wpisz:

taskkill /F /PID <NUMER_PID>

Flaga /F wymusza natychmiastowe zakończenie procesu, a /PID wskazuje konkretny identyfikator procesu. Zastąp <NUMER_PID> wartością, którą wcześniej odczytałeś z netstat i tasklist. Po wykonaniu komendy proces zostanie gwałtownie zatrzymany, a port powinien zostać zwolniony.

Ważne jest, aby przed użyciem taskkill sprawdzić dokładnie, co to za proces. Jeśli nazwa wskazuje na Twoją starą instancję aplikacji Java lub Tomcata, można go bezpiecznie zakończyć. Jeśli jednak jest to proces systemowy lub aplikacja, której używasz, lepiej rozważyć inne rozwiązanie.

Zakończenie procesu w Linux i macOS

W środowiskach Linux i macOS zakończenie procesu odbywa się zazwyczaj przy pomocy komendy kill. Mając numer PID, wpisz w terminalu:

kill -9 <NUMER_PID>

Parametr -9 oznacza wysłanie sygnału SIGKILL, który natychmiastowo przerywa działanie procesu. Ponownie zastąp <NUMER_PID> właściwym identyfikatorem. Po wykonaniu polecenia proces zostanie bezlitośnie zamknięty, a blokowany port stanie się dostępny.

Zarówno w Windows, jak i w systemach uniksowych obowiązuje ta sama zasada: upewnij się, że wiesz, co kończysz. Zatrzymanie krytycznych usług może spowodować niestabilność systemu lub utratę danych. Bezpiecznie jest kończyć procesy, które jasno identyfikujesz jako własne aplikacje, a w przypadku wątpliwości lepiej poszukać alternatywy.

Jak zmienić port aplikacji Spring Boot?

Nie zawsze da się lub warto zakończyć proces blokujący dany port. Czasem jest to inna ważna aplikacja, z której aktywnie korzystasz, lub usługa systemowa. W takich przypadkach najszybszym rozwiązaniem jest po prostu zmiana portu, na którym działa aplikacja Spring Boot.

Konfiguracja portu w application.properties

W typowej aplikacji Spring Boot konfiguracja znajduje się w pliku src/main/resources/application.properties. Aby zmienić port, dodaj lub zmodyfikuj linię:

server.port=9090

Wartość 9090 jest tu jedynie przykładem. Możesz użyć dowolnego innego, wolnego portu, np. 8081, 8090, 9000 lub innego, który nie jest aktualnie używany. Po zapisaniu zmian uruchom ponownie aplikację Spring Boot – powinna wystartować na nowym porcie bez konfliktów.

Jeśli korzystasz z formatu YAML, odpowiednia konfiguracja w pliku application.yml będzie wyglądać podobnie, ale w składni YAML. Niezależnie od formatu, klucz server.port jest odpowiedzialny za numer portu używany przez wbudowany serwer (np. Tomcat lub Jetty).

Automatyczne przydzielanie wolnego portu

Podczas developmentu bywa przydatne, aby aplikacja sama zajmowała losowy wolny port. W Spring Boot możesz to osiągnąć, ustawiając:

server.port=0

W takim przypadku aplikacja nie będzie nasłuchiwać na domyślnym 8080, lecz wybierze dowolny, aktualnie wolny port. To szczególnie użyteczne, gdy uruchamiasz wiele instancji tej samej aplikacji lub różne aplikacje jednocześnie.

Trzeba jednak pamiętać, że na środowisku produkcyjnym takie rozwiązanie nie jest zalecane. Tam chcesz mieć pełną kontrolę nad tym, na jakim porcie działa aplikacja, aby poprawnie skonfigurować load balancery, reverse proxy i inne elementy infrastruktury.

Problemy z wieloma instancjami w IDE

Błąd „Port already in use” bardzo często pojawia się nie przez obce procesy, ale przez poprzednie instancje Twojej aplikacji, które wciąż działają w tle. Dotyczy to szczególnie pracy z popularnymi IDE, takimi jak IntelliJ IDEA czy Eclipse.

Ukryte procesy w IntelliJ IDEA

W IntelliJ IDEA, po zakończeniu sesji debugowania lub uruchomienia, zdarza się, że proces aplikacji nie zostanie poprawnie zatrzymany. Może wówczas nadal nasłuchiwać na porcie 8080, mimo że z poziomu IDE wygląda, jakby wszystko było zakończone.

Warto spojrzeć na dolny pasek statusu lub zakładki Run / Debug. Często znajdziesz tam ikony reprezentujące działające procesy. Jeśli zobaczysz aktywną instancję aplikacji, kliknij przycisk w kształcie czerwonego kwadratu, aby ją zatrzymać. Dopiero wtedy spróbuj ponownie uruchomić Spring Boot.

Aktywne procesy w Eclipse

Podobny problem może wystąpić w Eclipse. W widoku Console lub Servers możesz mieć wciąż aktywną sesję serwera lub aplikacji. Jeśli nie zostanie poprawnie zatrzymana, port 8080 pozostanie zajęty i kolejne uruchomienie aplikacji zakończy się błędem.

Rozwiązaniem jest ręczne zatrzymanie wszystkich widocznych instancji serwera lub aplikacji za pomocą przycisku Stop. Po upewnieniu się, że nic nie działa w tle, ponowna próba uruchomienia Spring Boot powinna zakończyć się sukcesem.

Inne aplikacje i usługi blokujące port 8080

Czasem powodem błędu „Port already in use” nie jest Twoja wcześniejsza instancja, ale zupełnie inna usługa lub aplikacja. Port 8080 jest bardzo popularny, więc łatwo o kolizję z innymi narzędziami działającymi w środowisku developerskim.

Diagram pokazujący kilka usług używających portu 8080 i powodujących błąd Port already in use w Spring Boot

Typowe źródła konfliktów portów

Do najczęstszych winowajców należą:

  • Bazy danych wyposażone w interfejs webowy lub narzędzia do administracji,
  • Serwery webowe takie jak Apache Tomcat, Jetty, Nginx czy Apache HTTP Server,
  • Inne narzędzia developerskie, które uruchamiają lokalne serwery HTTP, np. serwery testowe API.

Wielu programistów ma lokalnie zainstalowane i uruchomione serwery Tomcat lub inne aplikacje webowe, które również domyślnie używają portu 8080. Jeśli jeden z tych serwerów działa w tle, nowa aplikacja Spring Boot nie będzie mogła startować na tym samym porcie.

Co zrobić w takiej sytuacji?

Masz wtedy dwie drogi:

  • Zatrzymać lub prze-konfigurować zewnętrzną usługę, która aktualnie zajmuje port 8080 (jeśli nie jest Ci w danym momencie potrzebna),
  • Zmienić port w aplikacji Spring Boot, aby uniknąć konfliktu z inną działającą usługą.

Wybór rozwiązania zależy od tego, która aplikacja jest dla Ciebie ważniejsza w danym momencie pracy. Często najłatwiej jest zmienić port Spring Boot na inny, mniej popularny numer i w ten sposób natychmiast pozbyć się problemu.

Jak zapobiegać problemom z portami w przyszłości?

Znasz już konkretne metody diagnozy i usuwania błędu „Port already in use”. Warto jednak zadbać o to, aby podobne kłopoty pojawiały się jak najrzadziej. Kilka dobrych praktyk pozwoli utrzymać środowisko developerskie w porządku.

Dobra higiena pracy z procesami

Staraj się systematycznie zamykać aplikacje po zakończeniu pracy – zarówno te uruchamiane z IDE, jak i z konsoli. To tak jak gaszenie światła po wyjściu z pokoju. Dzięki temu zmniejszasz ryzyko pozostawienia „duchów” procesów, które w tle nadal blokują porty.

Podczas developmentu przydatne jest też świadome korzystanie z spring-boot-devtools. To narzędzie świetnie przyspiesza restart aplikacji, ale w niektórych konfiguracjach IDE może sporadycznie prowadzić do pozostawiania niezamkniętych procesów. W większości przypadków działa jednak bardzo dobrze i warto je mieć w projekcie.

Skrypty porządkujące środowisko

Jeśli często uruchamiasz wiele aplikacji Java, możesz rozważyć stworzenie prostych skryptów start/stop, które przed uruchomieniem nowej instancji zamkną wszystkie działające procesy Javy. Przykładowo:

  • Na Windows: bash taskkill /F /IM java.exe
  • Na Linux / macOS: bash killall java

Takie skrypty potrafią szybko „posprzątać” środowisko, ale należy używać ich ostrożnie. Obie komendy kończą wszystkie procesy Javy, więc jeśli masz działające inne aplikacje Java, również zostaną one zatrzymane.

Izolacja środowiska za pomocą kontenerów

Dla bardziej zaawansowanych zastosowań warto pomyśleć o konteneryzacji aplikacji, np. z wykorzystaniem Dockera. Każda aplikacja działa wtedy w swoim izolowanym kontenerze, a mapowanie portów na hosta jest jasno określone i łatwe do kontrolowania.

Dzięki temu unikasz bałaganu z wieloma lokalnymi serwerami na tym samym systemie operacyjnym. Każda aplikacja ma swoje własne „mieszkanie”, a konflikty portów są dużo rzadsze i łatwiejsze do zdiagnozowania. To rozwiązanie przydaje się szczególnie przy pracy nad większymi systemami i zespołami.

Podsumowanie

Błąd „Port already in use” w aplikacji Spring Boot to częsty, ale dobrze zrozumiany problem, wynikający wyłącznie z konfliktu o numer portu. Zwykle oznacza, że inny proces – czasem Twoja własna poprzednia instancja, a czasem zupełnie inna usługa – już nasłuchuje na tym samym porcie, na którym próbuje uruchomić się Twoja aplikacja.

Znając narzędzia takie jak netstat, lsof, tasklist, taskkill i kill, możesz szybko zidentyfikować i zakończyć proces blokujący port. Alternatywnie, wystarczy zmienić konfigurację Spring Boot przy pomocy parametru server.port, aby aplikacja działała na innym, wolnym porcie.

Stosując opisane dobre praktyki – poprawne zamykanie aplikacji, świadome używanie IDE, ewentualne skrypty porządkujące oraz konteneryzację – możesz znacząco zminimalizować ryzyko ponownego wystąpienia tego błędu. Dzięki temu problem „Port already in use” stanie się tylko drobną przeszkodą, a Twoja aplikacja Spring Boot będzie startować pewnie i bez zająknięcia.

Marek Radoszewski

Autor

Marek Radoszewski

Freelance developer i tech blogger od 7 lat. Pracował przy projektach dla klientów z Polski, UK i USA. Na blogu pisze o praktycznych aspektach programowania, narzędziach i tym, jak skutecznie rozwijać karierę jako niezależny programista.

Wróć do kategorii Narzędzia i Praktyki