«1. Обзор

В этом кратком руководстве мы рассмотрим, что вызывает распространенную ошибку java.net.BindingException: ошибка «Адрес уже используется» и как мы можем с ней справиться.

2. Когда возникает ошибка?

Как мы знаем, сервер Apache Tomcat по умолчанию использует порт 8080.

Номера портов находятся в диапазоне от 0 до 65535, однако в любой момент порт может быть занят только одним приложением.

Исключение указывает на то, что приложение пытается использовать порт, который уже занят каким-то другим процессом, или мы неправильно остановили сервер Tomcat.

3. Диагностика

Чтобы решить эту ошибку, мы можем либо убить службу, использующую этот порт, либо изменить наш веб-сервер, чтобы он работал на другом порту.

3.1. Обнаружение конфликта

В этом случае нам нужно выяснить, какое приложение использует порт.

Команду netstat можно использовать для обнаружения текущих соединений TCP/IP.

Ниже приведены команды, которые можно использовать для поиска и уничтожения процесса в различных средах.

В Windows последний столбец вывода даст нам идентификатор процесса службы, работающей в данный момент на 8080:

netstat -ano | find "8080"

Вывод:

TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 21376

Здесь 21376 — это идентификатор процесса, который прослушивает порт 8080.

В среде Unix/Linux:

netstat -pant | grep "8080"

Вывод:

TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 21376

То же, что вывод Windows. Здесь 21376 — это идентификатор процесса, прослушивающего порт 8080.

В Mac OS X:

lsof -t -i :8080

Вывод:

21376

Будет отображаться только PID.

3.2. Запуск сервера на другом порту

Если мы знаем, какой процесс выполняется, почему он работает и что он должен работать на этом порту, мы можем изменить порт, на котором пытается работать наше серверное приложение.

Чтобы изменить порт Tomcat, нам нужно отредактировать файл server.xml. Для этого:

    Откройте папку tomcat/conf, отредактируйте server.xml, замените порт коннектора новым портом, перезапустите сервер tomcat

Файл server.xml выглядит следующим образом:

<Connector port="8080" protocol="HTTP/1.1" 
  connectionTimeout="20000" redirectPort="8443" />

Теперь Tomcat будет работать на настроенный порт.

3.3. Уничтожение запущенной службы

Чтобы остановить запущенный процесс, мы можем использовать команду kill.

Используя идентификатор процесса, который мы нашли в 3.1., нам потребуются разные команды в зависимости от используемой операционной системы.

В среде Windows:

taskkill /F /PID 21376

В среде Unix/Linux:

kill - 21376

В среде Mac OS X:

kill -9 21376

4. Заключение

Как упоминалось в начале статьи , java.net.BindingException является распространенной, но легко устраняемой ошибкой.

Основная трудность заключается в том, чтобы найти конфликтующую службу, используя порт с терминальным приложением netstat, а затем определить соответствующий план действий.

После обнаружения исправить легко.