Wie behebe ich den Fehler "java.net.BindException: Adresse wird bereits verwendet: JVM_Bind"?

184

In Eclipse habe ich folgenden Fehler erhalten:

run:
     [java] Error creating the server socket.
     [java] Oct 04, 2012 5:31:38 PM cascadas.ace.AceFactory bootstrap
     [java] SEVERE: Failed to create world : java.net.BindException: Address already in use: JVM_Bind
     [java] Java Result: -1
BUILD SUCCESSFUL
Total time: 10 seconds

Ich bin mir nicht sicher, warum es jetzt aufgetaucht ist, aber es lief erst vor ein paar Stunden einwandfrei. Muss ich meinen Computer neu starten? Wie komme ich dem auf den Grund? Ich freue mich über Tipps oder Ratschläge.

Kaffee
quelle
1
Ich habe dies häufig auf Entwicklungsmaschinen gesehen, wenn Sie Codetests ausführen. Wie kann das Problem vermieden werden?
wird

Antworten:

141

Ja, Sie haben einen anderen Prozess an denselben Port gebunden.

TCPView (nur Windows) von Windows Sysinternals ist meine Lieblings-App, wenn ich einen JVM_BIND-Fehler habe. Es zeigt, welche Prozesse welchen Port abhören. Es bietet auch ein praktisches Kontextmenü, um entweder den Prozess abzubrechen oder die störende Verbindung zu schließen.

Guido Simone
quelle
eine schnelle Lösung: Öffnen Sie die Serveransicht> doppelklicken Sie auf den Server> ändern Sie die verwendeten Portnummern (z. B. für Tomcat-Administrator, HTTP / 1.1 und AJP / 1.3)
Adrien Be
2
@novice_developer netstatist der Befehl, den Sie suchen, mit -a und -p Optionen, man netstatist Ihr Freund für den Rest :)
sox mit Monica
1
Wenn der obige Prozess nicht funktioniert, starten Sie den PC einmal neu. Ich denke, es wird funktionieren. In meinem Fall fing es an zu funktionieren.
Kumar
195

Wenn Sie wissen, welchen Port der Prozess ausführt, können Sie Folgendes eingeben: lsof -i:<port> .

Zum Beispiel, lsof -i:8080um den Prozess (pid) aufzulisten, der auf Port 8080 ausgeführt wird.

Dann töte den Prozess mit kill <pid>

Diego Pino
quelle
4
Ja, das ist Linux. Versuchen Sie dann etwas Äquivalentes in Windows. Vielleicht kann dies helfen: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Diego Pino
1
Ich benutze also Raspbian und es heißt: bash: lsof: Befehl nicht gefunden. irgendwelche Vorschläge?
Mona Jalal
1
@ MonaJalal hmmm nicht sicher, aber vielleicht versuchen Sie etwas wiesudo apt-get install lsof
Kaffee
@DiegoPino Ich habe den gleichen Fehler, den java.net.BindException: Address already in use (Bind failed) ich verwendet lsof -i:8080und bekommen habe tcp6 0 0 :::8080 :::* LISTEN 106872/java. Was soll ich machen ? Java töten?
Avijit Barua
@AvijitBarua Die Prozess-ID (pid) des an diesen Port gebundenen Java-Programms lautet 106872. Jedes von Ihnen gestartete Java-Programm präsentiert sich als Java-Programm (es ist die virtuelle Java-Maschine, auf der Ihr kompilierter Code ausgeführt wird). Ja, Sie können dieses Java-Programm beenden oder beenden, wenn es sich nicht um ein kritisches (System-) Tool handelt, sondern um Ihr eigenes Programm. Werfen Sie einen Blick in einen Task-Manager wie htop. Möglicherweise versuchen Sie, eine Verbindung zu einem Port herzustellen, der von einem gültigen Programm verwendet wird, das nicht beendet werden sollte.
xuiqzy
112

In Fenstern

netstat -ano

listet alle Protokolle, Ports und Prozesse auf, die abhören. Verwenden

taskkill -pid "proces to kill" /f

um den Prozess abzubrechen, der den Port abhört. z.B

 taskkill -pid 431 /f
Abhi
quelle
10
netstat -ano | Suchen Sie nach "Nummer Ihres Ports". Verwenden Sie diese Option unter Windows für einen bestimmten Port.
BlondCode
Bei mir (unter Windows 10) findhat es nicht funktioniert, aber findstrfunktioniert. Um Fehlalarme zu vermeiden, ist es auch hilfreich, einen Doppelpunkt voranzustellen, z netstat -ano | findstr :8080. Wenn Sie dies getan haben - sagen wir, es wurde eine PID von 1234 zurückgegeben -, können Sie den Namen dieses Prozesses nachschlagen, tasklist /fi "pid eq 1234
indem Sie vor
34

In Mac:

Prozess beenden Terminal:kill <pid>

Pid suchen: Terminal:lsof -i:<port>

Von Diego Pino antworten

Hoyin
quelle
11
kill <pid> hat auf dem Mac nicht funktioniert, kill -9 <PID> hat bei mir funktioniert
Samy Omar
33

In Ubuntu / Unix können wir dieses Problem in 2 Schritten lösen, wie unten beschrieben.

  1. Art netstat -plten |grep java

    Dies ergibt eine Ausgabe ähnlich der folgenden:

    tcp   0   0 0.0.0.0:8080   0.0.0.0:*  LISTEN   1001  76084  9488/java       

    Hier 8080ist die Portnummer, an der der Java-Prozess lauscht, und 9488seine Prozess-ID (pid).

  2. Um den besetzten Port freizugeben, müssen wir diesen Prozess mit dem beenden kill Befehl beenden.

    kill -9 9488

    9488ist die Prozess-ID von früher. Wir verwenden -9, um den Prozess zu stoppen.

Ihr Port sollte jetzt frei sein und Sie können den Server neu starten.

Bharti Rawat
quelle
Ich konfiguriere CentOs Server im digitalen Ozean. Wie kann ich den Server erneut ausführen, wenn ich diesen Prozess abbrich?
Avijit Barua
Verwenden Sie -9 nur, wenn es sich um Ihr eigenes Programm handelt und Sie dort keine Daten zu verlieren haben. Es beendet den Prozess unrein, -15 weist das Programm an, sich selbst zu beenden.
xuiqzy
27

(Nur Windows)

Um einen Prozess abzubrechen, müssen Sie zuerst die Prozess-ID (pid) finden.

Durch Ausführen des Befehls:

netstat -ano | findstr :yourPortNumber

Wie im Bild unten gezeigt

Sie erhalten Ihre Prozess-ID (PID). Führen Sie den folgenden Befehl aus, um denselben Prozess abzubrechen:

taskkill /pid yourid /f

Geben Sie hier die Bildbeschreibung ein

Sufiyan Ansari
quelle
7

Auf demselben Port wird ein anderer Prozess ausgeführt.

Sie können versuchen, einen der in Ihrem Task-Manager ausgeführten java.exe-Dienste zu beenden. Stellen Sie sicher, dass Sie Eclipse nicht beenden, da dieser ebenfalls als java.exe aufgeführt ist. Wenn nichts anderes funktioniert, wird es durch einen Neustart des Computers trotzdem behoben. Es sieht so aus, als ob Sie eine Steckdose aus einem früheren Test nicht heruntergefahren haben. Hoffe das hilft.

Javarebel
quelle
6

Für diejenigen, die nach der einfachsten Antwort suchen (wie wir sie normalerweise vermissen), stoppen Sie einfach Ihr laufendes Projekt und starten Sie es erneut. Die meiste Zeit vergessen wir, das zuvor ausgeführte Projekt zu stoppen, und wenn wir das Projekt erneut ausführen, zeigt es ein solches Problem.

Ich füge auch ein Foto hinzu, um es klarer zu machen (ich verwende 'Spring Tool Suite'). Sie müssen also entweder auf die Schaltfläche ganz rechts klicken, wenn Sie dasselbe Projekt neu starten möchten, oder zuerst auf die Schaltfläche 2 von rechts klicken, um das Projekt zu stoppen, und dann auf die Schaltfläche ganz links, um es auszuführen dein Projekt. Ich hoffe, dass dies das Problem einiger neuerer Programmierer lösen wird. :) :)

Geben Sie hier die Bildbeschreibung ein

Me_developer
quelle
4

Ermitteln Sie in der Windows CMD-Zeile die Prozess-ID, die eine Verbindung am Bindungsport enthält, indem Sie den folgenden Befehl eingeben:

C:> netstat -a -o

-a Alle Verbindungen anzeigen

-o Prozesskennung anzeigen

Und dann beenden Sie den Prozess.

CharlesX
quelle
2

Ja, wie Guido Simone es sagte, weil ein anderer Prozess denselben Port abhört. Wenn Sie sich in Ubuntu befinden, können Sie diesen Prozess einfach mit einem Befehl beenden sudo kill $(sudo lsof -t -i:[port number])

Ex: sudo kill $(sudo lsof -t -i:8080)

Aber einmal hat es bei mir nicht funktioniert. Ich gab den Befehl

$ lsof -i:[port] 

und es zeigt nichts.

Ich habe meine Docker-Container mit dem Befehl überprüft, docker ps -aaber keiner von ihnen lebt. Alle Container wurden gestoppt (aber ich erinnere mich, ich habe einen Container gestoppt, der vor einigen Minuten denselben Port verwendet hat.) Um sicherzustellen, dass Docker nicht der Grund ist, stoppe ich ganz Docker-Prozess mit Befehl sudo service docker stopund versuchen Sie es erneut. Überraschenderweise zeigte Eclipse den Fehler zu diesem Zeitpunkt nicht. Es führt mein Programm perfekt aus.

Hoffe, meine Erfahrung wird jemandem helfen.

Yasitha Bandara
quelle
1

Der Port wird bereits von einem anderen Prozess verwendet, da @Diego Pino sagte, dass Sie lsof unter Unix verwenden können, um den Prozess zu lokalisieren und den jeweiligen zu beenden. Wenn Sie unter Windows arbeiten, verwenden Sie netstat -ano, um alle Pids des Prozesses und des zu erhalten Ports, die jeder erwirbt. Suche nach deinem beabsichtigten Port und töte.

Um ganz einfach zu sein, starten Sie einfach Ihre Maschine neu, wenn das möglich ist :)

Akash Yadav
quelle
1

Starten Sie den PC einmal neu, ich denke, es wird funktionieren. In meinem Fall fing es an zu funktionieren. Eine weitere Möglichkeit besteht darin, den Task-Manager aufzurufen und den Vorgang zu beenden.

Screenshot als Referenz.

Kumar
quelle
Bitte antworten Sie nicht mit einem Kommentar / einer Frage. Es wäre vorzuziehen, wenn Sie dies löschen würden.
Clijsters
1

Sie müssen Ihren Port schließen, wenn Sie ein Linux-Benutzer sind, und dann eingeben

fuser -k 8080/tcp
Machhindra Neupane
quelle
1

In meinem Fall lief Tomcat im Hintergrund. Ich habe es als externes Servlet installiert, während ich Eclipse verwendet habe. Mit einem Spring Boot in Intellij hat es einen eigenen Server, kann aber nicht starten, solange es bereits belegt ist.
In meinem Fall startet Tomcat automatisch. Ich schalte mein Betriebssystem ein. Deshalb muss ich ihn manuell herunterfahren:

$ sudo service tomcat stop

Natürlich hängt "Tomcat" davon ab, welche Version von Tomcat Sie verwenden.
Hoffe es könnte jemandem helfen.

EnGoPy
quelle
0

Ich hatte ein ähnliches Problem in Eclipse, als zwei Konsolen geöffnet wurden, als ich zuerst das Serverprogramm und dann das Clientprogramm startete. Früher habe ich das Programm in der einzelnen Konsole gestoppt, weil ich dachte, es hätte den Server geschlossen, aber nur den Client und nicht den Server. Ich habe festgestellt, dass in meinem Task-Manager Java-Prozesse ausgeführt werden. Dieses Problem wurde gelöst, indem sowohl Server- als auch Client-Programme von ihren einzelnen Konsolen aus geschlossen wurden (Eclipse zeigt die Konsole des neuesten aktiven Programms an). Als ich das Serverprogramm erneut startete, war der Port wieder offen, um erfasst zu werden.

Chetan Gowda
quelle
0

Ihr Port muss in einem anderen Prozess belegt sein. Sie können TCPView also unter https://technet.microsoft.com/en-us/sysinternals/bb897437 herunterladen und den Prozess für den verwendeten Port .

Wenn Sie Ihren Port nicht kennen, doppelklicken Sie auf den Server, der nicht gestartet wird, und klicken Sie auf Servereigenschaftsseite öffnen und dann in der linken Spalte auf glassfish. Die Ports finden Sie hier.

suketup
quelle
0

(1) Überprüfen Sie, ob der Port verwendet wird oder nicht, und beenden Sie diesen Vorgang

$ lsof -i: [Port]

(2) Ein weiterer Grund ist, dass der Port von IPv6 verwendet wird. Lösung:

Bearbeiten Sie /etc/sysctl.conf

Fügen Sie dies der Datei hinzu

net.ipv6.conf.all.disable_ipv6 = 1

dann mach es wirksam

$ sudo sysctl -p /etc/sysctl.conf

oder einfach neu starten

Tonysok
quelle
0

Dies bedeutet, dass bereits ein anderer Prozess den Port verwendet. Wenn dieser Port von einigen anderen kritischen Anwendungen verwendet wird und Sie diese Anwendung nicht schließen möchten, ist es besser, einen anderen Port auszuwählen, der frei verwendet werden kann.

Konfigurieren Sie Ihre Anwendung so, dass sie jeden anderen freien Port verwendet, und Sie werden sehen, dass Ihre Anwendung funktioniert.

Rakesh Burbure
quelle
0

Für Fenster :

  1. Suchen Sie die Prozess-ID

    netstat -nao | finde "8080"

Es zeigt Ihnen die Prozess-ID als Nummer.

Beispiel :

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

Hier ist 18856 die Prozess-ID

  1. Töte diesen Prozess

    Taskkill / PID 18856 / F.

Ausgabe : ERFOLG: Der Prozess mit PID 18856 wurde beendet.

Hier beenden Sie mit taskkill die Prozess-ID: 18856

Für Linux / Mac :

sudo kill -9 $(sudo lsof -t -i:8080)

Hier finden Sie den Prozess, sudo lsof -t -i:8080der ihn mit dem Befehl sudo kill verwendet und beendet

Md. Sajedul Karim
quelle