我正在尝试将一个 Web 应用程序(RODA 2.0)作为 WAR 部署到 Debian Stretch 中的 tomcat 8.5 和 openjdk 8 中,java.net.BindException: Address already in use
启动时出现错误(请参阅完整的堆栈跟踪https://pastebin.com/SSDJX6yc)。现在,webapp 确实尝试侦听端口 2552,但该端口未被使用,并且lsof -ni :2552
循环运行表明该端口实际上从未被使用。在 osx 上,它甚至在 tomcat 中也能成功启动,并成功侦听给定端口。
我意识到也许 tomcat 安全策略会阻止这种情况发生,但尝试使用 osx 机器上的 catalina.policy 会产生相同的结果。我还尝试在原始 debian 策略文件中添加授权条目:
grant codeBase "war:file:${catalina.base}/webapps/ROOT.war*" {
permission java.net.SocketPermission "192.168.*:2552", "listen, connect, accept, resolve";
};
您是否知道实际问题可能是什么,以及如何解决它(除了尝试修改 RODA 以不尝试连接给定端口)?
答案1
我找到了问题(很可能):有一个僵尸(已停用)Java 进程正在运行,很可能确实占用了端口 2552。但lsof
无法显示它。硬重启后问题消失(软重启似乎没有成功,虚拟机只是没有响应)。
寓意:不要只相信 lsof,尝试其他工具,如 nmap 和 netstat,并警惕僵尸!