Я пытаюсь развернуть веб-приложение (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, и берегитесь зомби!