Назад | Перейти на главную страницу

java.net.BindException: адрес уже используется в tomcat только на debian

Я пытаюсь развернуть веб-приложение (RODA 2.0) как WAR на участке debian в tomcat 8.5 и openjdk 8, и я получаю java.net.BindException: Address already in use при запуске (см. полную трассировку стека на https://pastebin.com/SSDJX6yc). Теперь веб-приложение действительно пытается прослушивать порт 2552, но он не используется и работает lsof -ni :2552 в цикле показывает, что он фактически не используется. В osx он успешно запускается даже в tomcat и успешно прослушивает данный порт.

Я понял, что, возможно, политики безопасности tomcat предотвратят это, но попытка использовать catalina.policy с машины osx дала тот же результат. Я также попытался добавить запись о предоставлении права в исходные файлы политики Debian:

grant codeBase "war:file:${catalina.base}/webapps/ROOT.war*" {
    permission java.net.SocketPermission "192.168.*:2552", "listen, connect, accept, resolve";
};

Есть ли у вас идеи, в чем может заключаться настоящая проблема и как ее решить (помимо попытки изменить RODA, чтобы не пытаться подключиться к данному порту)?

Я обнаружил проблему (скорее всего): был запущен (несуществующий) java-процесс зомби, который, скорее всего, действительно занимал порт 2552. И lsof не удалось его отобразить. Проблема исчезла после жесткой перезагрузки (мягкая перезагрузка не прошла, виртуальная машина просто перестала отвечать).

Мораль: не доверяйте lsof, попробуйте другие инструменты, такие как nmap и netstat, и берегитесь зомби!