Comment résoudre l'erreur «java.net.BindException: Adresse déjà utilisée: JVM_Bind»?

187

Dans Eclipse, j'ai cette erreur:

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

Je ne sais pas pourquoi cela s'est produit maintenant, mais cela a bien fonctionné il y a quelques heures à peine. Dois-je redémarrer ma machine? Comment puis-je aller au fond des choses? J'apprécie tous les trucs ou conseils.

café
la source
1
J'ai souvent vu cela sur les machines de développement lorsque vous exécutez des essais de code - Comment éviter le problème?
sera

Réponses:

141

Oui, vous avez un autre processus lié au même port.

TCPView (Windows uniquement) à partir de Windows Sysinternals est mon application préférée chaque fois que j'ai une erreur JVM_BIND. Il montre quels processus écoutent sur quel port. Il fournit également un menu contextuel pratique pour soit tuer le processus, soit fermer la connexion qui gêne.

Guido Simone
la source
une solution rapide: ouvrez la vue du serveur> double-cliquez sur le serveur> changez les numéros de port utilisés (par exemple pour Tomcat admin, HTTP / 1.1, & AJP / 1.3)
Adrien Be
2
@novice_developer netstatest la commande que vous recherchez, avec les options -a et -p, man netstatest votre ami pour tout le reste :)
sox avec Monica
1
Si le processus ci-dessus ne fonctionne pas, redémarrez le PC une fois, je pense que cela fonctionnera. Cela a commencé à fonctionner dans mon cas.
Kumar
195

Si vous savez quel port le processus est en marche , vous pouvez taper: lsof -i:<port>.

Par exemple, lsof -i:8080pour lister le processus (pid) s'exécutant sur le port 8080.

Puis tuez le processus avec kill <pid>

Diego Pino
la source
4
Oui, c'est Linux. Ensuite, essayez quelque chose d'équivalent dans Windows. Peut-être que cela peut aider: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Diego Pino
1
donc j'utilise Raspbian et il dit: bash: lsof: commande non trouvée. Aucune suggestion?
Mona Jalal
1
@MonaJalal hmmm pas sûr mais, peut-être essayer quelque chose commesudo apt-get install lsof
Café
@DiegoPino Je suis confronté à la même erreur que java.net.BindException: Address already in use (Bind failed) j'ai utilisée lsof -i:8080et obtenue tcp6 0 0 :::8080 :::* LISTEN 106872/java. Que devrais-je faire ? Tuez java ??
Avijit Barua
@AvijitBarua L'ID de processus (pid) du programme java lié à ce port est 106872. Chaque programme Java que vous lancez se présente comme le programme java (c'est la machine virtuelle java qui exécute votre code compilé). Alors oui, vous pouvez quitter ou tuer ce programme java, s'il ne s'agit pas d'un outil (système) critique, mais de votre propre programme; jetez un œil dans un gestionnaire de tâches comme htop. Peut-être que vous essayez de vous lier à un port utilisé par un programme valide qui ne devrait pas être tué.
xuiqzy
114

Dans windows

netstat -ano

listera tous les protocoles, ports et processus à l'écoute. Utilisation

taskkill -pid "proces to kill" /f

pour tuer le processus écoutant le port. par exemple

 taskkill -pid 431 /f
Abhi
la source
10
netstat -ano | find "numéro de votre port" Utilisez ceci sur Windows pour un port spécifique.
BlondCode
Pour moi (avec Windows 10) findn'a pas fonctionné mais findstra fonctionné. Pour éviter les faux positifs, il aide également à ajouter un deux-points, par exemple netstat -ano | findstr :8080. Après avoir fait cela - disons que cela a renvoyé un PID de 1234 - si vous souhaitez ensuite rechercher le nom de ce processus, vous pouvez le faire via tasklist /fi "pid eq 1234".
Steve Chambers
34

Sous Mac:

Tuer le terminal de processus :kill <pid>

Trouver pid: Terminal:lsof -i:<port>

De Diego Pino réponse

Hoyin
la source
11
kill <pid> ne fonctionnait pas sur mac, kill -9 <PID> a travaillé avec moi
Samy Omar
33

Dans Ubuntu / Unix, nous pouvons résoudre ce problème en 2 étapes comme décrit ci-dessous.

  1. Type netstat -plten |grep java

    Cela donnera une sortie similaire à:

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

    Voici 8080le numéro de port sur lequel le processus java écoute et 9488son identifiant de processus (pid).

  2. Afin de libérer le port occupé, nous devons tuer ce processus en utilisant la killcommande.

    kill -9 9488

    9488est l'identifiant de processus antérieur. Nous utilisons -9pour forcer l'arrêt du processus.

Votre port devrait maintenant être libre et vous pouvez redémarrer le serveur.

Bharti Rawat
la source
Je configure le serveur CentOs dans l'océan numérique. Si je tue ce processus, comment puis-je réexécuter le serveur?
Avijit Barua
N'utilisez -9 que s'il s'agit de votre propre programme et que vous n'avez aucune donnée à y perdre. Il tue mal le processus, -15 dit au programme de se fermer.
xuiqzy le
27

(Windows seulement)

Pour tuer un processus, vous devez d'abord trouver l'ID du processus (pid)

En exécutant la commande:

netstat -ano | findstr :yourPortNumber

Comme le montre l'image ci-dessous

Vous obtiendrez votre identifiant de processus (PID), maintenant pour tuer le même processus, exécutez cette commande:

taskkill /pid yourid /f

entrez la description de l'image ici

Soufiyan Ansari
la source
7

Vous avez un autre processus en cours d'exécution sur le même port.

Vous pouvez essayer de tuer l'un des services java.exe exécutés dans votre gestionnaire de tâches - ps assurez-vous de ne pas tuer eclipse car il est également répertorié sous le nom de java.exe. Si rien d'autre ne fonctionne, le redémarrage de votre machine résoudra le problème de toute façon. Il semble que vous ne coupiez pas une socket d'un test précédent. J'espère que cela t'aides.

Javarebel
la source
6

Pour ceux qui recherchent la plus simple des réponses (car c'est ce qui nous manque généralement), arrêtez simplement votre projet en cours et redémarrez-le. La plupart du temps, nous oublions d'arrêter le projet que nous avons exécuté plus tôt et lorsque nous réexécutons le projet, un tel problème apparaît.

Je joins également une photo pour la rendre plus claire (j'utilise 'Spring tool suite'). Donc, ce que vous devez faire est soit de cliquer sur le bouton à l'extrême droite, si vous souhaitez relancer le même projet, soit de cliquer d'abord sur le bouton qui est le 2ème à partir de la droite pour arrêter votre projet puis sur le bouton à l'extrême gauche pour l'exécuter votre projet. J'espère que cela résoudra le problème de quelques-uns des nouveaux programmeurs. :)

entrez la description de l'image ici

Moi_developer
la source
4

Dans la ligne Windows CMD, recherchez l'ID de processus qui détient une connexion sur le port de liaison en entrant la commande suivante:

C:> netstat -a -o

-a afficher toutes les connexions

-o afficher l'identifiant du processus

Et puis mettre fin au processus.

CharlesX
la source
2

Oui, comme l'a dit Guido Simone parce qu'un autre processus écoute le même port.Si vous êtes dans Ubuntu, vous pouvez simplement tuer ce processus en donnant la commande sudo kill $(sudo lsof -t -i:[port number])

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

Mais une fois, cela n'a pas fonctionné pour moi. j'ai donné la commande

$ lsof -i:[port] 

et cela ne montre rien.

J'ai vérifié mes conteneurs docker à l'aide de la commande docker ps -amais aucun d'entre eux n'est en vie.Tous les conteneurs se sont arrêtés (mais je me souviens, j'ai arrêté un conteneur qui était utilisé dans le même port il y a quelques minutes.). processus docker à l'aide de la commande sudo service docker stopet réessayez. Étonnamment, eclipse n'a pas montré l'erreur à ce moment-là. Il a parfaitement exécuté mon programme.

J'espère que mon expérience aidera quelqu'un.

Yasitha Bandara
la source
2

Vous devez fermer votre port si vous êtes un utilisateur Linux puis tapez

fuser -k 8080/tcp
Machhindra Neupane
la source
1

Le port est déjà utilisé par un autre processus comme @Diego Pino a dit que vous pouvez utiliser lsof sous unix pour localiser le processus et tuer le processus respectif, si vous êtes sous Windows, utilisez netstat -ano pour obtenir tous les pids du processus et le ports que tout le monde acquiert. recherchez votre port prévu et tuez.

pour être très simple, redémarrez simplement votre machine, si c'est possible :)

Akash Yadav
la source
1

Redémarrez le PC une fois, je pense que cela fonctionnera. Cela a commencé à fonctionner dans mon cas. Une dernière chose peut être faite, accédez au Gestionnaire des tâches et terminez le processus.

Capture d'écran pour la référence.

Kumar
la source
Veuillez ne pas répondre par un commentaire / une question. Il serait préférable que vous supprimiez ceci.
Clijsters
1

Dans mon cas, Tomcat fonctionnait en arrière-plan. Je l'ai installé en tant que servlet externe lors de l'utilisation d'Eclipse. Avec un Spring Boot dans Intellij, il a son propre serveur mais ne peut pas démarrer tant qu'il est déjà occupé.
Dans mon cas, Tomcat démarre automatiquement, j'allume mon système d'exploitation, c'est pourquoi je dois l'arrêter manuellement:

$ sudo service tomcat stop

bien sûr, "tomcat" dépend de la version de tomcat que vous utilisez.
J'espère que cela pourrait aider quelqu'un.

EnGoPy
la source
0

J'ai rencontré un problème similaire dans Eclipse lorsque deux consoles ont été ouvertes lorsque j'ai démarré le programme Server d'abord, puis le programme Client. J'avais l'habitude d'arrêter le programme dans la console unique en pensant qu'il avait fermé le serveur, mais qu'il n'avait fermé que le client et non le serveur. J'ai trouvé des processus Java en cours d'exécution dans mon gestionnaire de tâches. Ce problème a été résolu en fermant les programmes serveur et client à partir de leurs consoles individuelles (Eclipse affiche la console du dernier programme actif). Ainsi, lorsque j'ai redémarré le programme Server, le port était à nouveau ouvert pour être capturé.

Chetan Gowda
la source
0

Votre port doit être occupé dans un autre processus. Vous pouvez donc télécharger TCPView sur https://technet.microsoft.com/en-us/sysinternals/bb897437 et processus pour le port utilisé.

Si vous ne connaissez pas votre port, double-cliquez sur le serveur qui ne démarre pas et cliquez sur Ouvrir la page des propriétés du serveur et cliquez sur glassfish dans la colonne de gauche. Vous trouverez les ports ici.

suketup
la source
0

(1) vérifier que le port est utilisé ou non, tuer ce processus

$ lsof -i: [port]

(2) une autre raison est que le port est utilisé par ipv6, solution:

éditer /etc/sysctl.conf

ajouter ceci au fichier

net.ipv6.conf.all.disable_ipv6 = 1

alors fais-le effet

$ sudo sysctl -p /etc/sysctl.conf

ou simplement redémarrer

tonysok
la source
0

Cela signifie qu'un autre processus utilise déjà le port. Dans le cas où ce port est utilisé par d'autres applications critiques et que vous ne souhaitez pas fermer cette application, la meilleure façon est de choisir un autre port qui est libre d'utilisation.

Configurez votre application pour utiliser n'importe quel autre port qui est gratuit et vous verrez votre application fonctionner.

Rakesh Burbure
la source
0

Pour Windows :

  1. Trouvez l'identifiant du processus

    netstat -nao | trouver "8080"

Il vous montrera l'ID de processus sous forme de nombre.

Exemple :

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

Ici 18856 est l'ID de processus

  1. Tuez ce processus

    taskkill / PID 18856 / F

Production : SUCCÈS: le processus avec PID 18856 est terminé.

Ici, en utilisant taskkill, vous tuez l'ID de processus: 18856

Pour Linux / Mac :

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

Vous trouverez ici le processus en utilisant sudo lsof -t -i:8080et en le tuant par la commande sudo kill

Md. Sajedul Karim
la source