«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, а затем определить соответствующий план действий.
После обнаружения исправить легко.