Tomcat无法启动(抛出java.net.BindException错误)

24

我按照以下设置来运行一个Java Web项目,但不知道为什么我的Tomcat无法从Eclipse中启动:

JAVA_HOME : C:\Program Files\Java\jdk1.6.0_03  
PATH : C:\Program Files\Java\jdk1.6.0_03\bin  
CATALINA_HOME : D:\javaworkspaces\apache-tomcat-7.0.27  

按照要求,我从Eclipse中设置了一个新的服务器,并提供了Tomcat安装路径。

根据某些论坛的建议,我已将tomcat-juli.jar添加到类路径中。
尽管如此,当我尝试启动Tomcat服务器时,我收到了45秒内Tomcat没有启动的错误。

我收到以下日志消息:

Jul 26, 2012 5:49:34 PM org.apache.catalina.core.AprLifecycleListener init  
INFO: The APR based Apache Tomcat Native library which allows optimal performance in     production environments was not found on the java.library.path: C:\Program Files\Java\jre6\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files/Java/jre7/bin/client;C:/Program Files/Java/jre7/bin;C:/Program Files/Java/jre7/lib/i386;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\TortoiseSVN\bin;C:\Program Files\Java\jdk1.6.0_03\bin;D:\eclipse-jee-indigo-SR2-win32\eclipse;;.  
Jul 26, 2012 5:49:34 PM org.apache.tomcat.util.digester.SetPropertiesRule   
 begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property         'source' to 'org.eclipse.jst.j2ee.server:JEE_Day01' did not find a matching property.  
Jul 26, 2012 5:49:34 PM org.apache.coyote.AbstractProtocol init  
INFO: Initializing ProtocolHandler ["http-bio-80"]  
Jul 26, 2012 5:49:35 PM org.apache.coyote.AbstractProtocol init  
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]  
Jul 26, 2012 5:49:35 PM org.apache.coyote.AbstractProtocol init  
SEVERE: Failed to initialize end point associated with ProtocolHandler ["ajp-bio-8009"]  
java.net.BindException: Address already in use: JVM_Bind <null>:8009  
at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:393)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:566)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:417)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:956)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:814)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.startup.Catalina.load(Catalina.java:624)
at org.apache.catalina.startup.Catalina.load(Catalina.java:649)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:449)  
Caused by: java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:49)
at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:380)
... 16 more  
Jul 26, 2012 5:49:35 PM org.apache.catalina.core.StandardService initInternal    
    SEVERE: Failed to initialize connector [Connector[AJP/1.3-8009]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[AJP/1.3-8009]]  
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)  
    at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)  
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:814)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.startup.Catalina.load(Catalina.java:624)
at org.apache.catalina.startup.Catalina.load(Catalina.java:649)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:449)  
Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:958)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
... 12 more

我已经参考了多个论坛,但是在这种情况下卡住了。请指导我。

11个回答

24
这些行:
SEVERE: Failed to initialize end point associated with ProtocolHandler ["ajp-bio-8009"]
java.net.BindException: Address already in use: JVM_Bind <null>:8009  

这句话意味着端口8009上已经运行了一个服务。是否已经有一个带有AJP协议的Tomcat正在运行?如果需要在8009上运行该服务,您可以通过更改server.xml中的连接器配置来实现,例如以下配置:

<Connector port="8089" protocol="AJP/1.3" redirectPort="8443" />

10

7

使用以下命令杀死监听指定端口(如8009)的进程:

netstat -a -o -n

通过以上命令获取进程的PID,示例如下: TCP [::]:8009 [::]:0 LISTENING 892

使用taskkill命令结束该进程,例如:

taskkill /F /PID 892


要终止进程,您可能需要管理员权限。为此,请在Windows的开始搜索框中查找“cmd”,右键单击“cmd.exe”,然后选择“以管理员身份打开”。 - galeop

5

java.net.BindException: 地址已在使用中: JVM_Bind :8009

这意味着另一个进程正在使用此端口。它可能是另一个Tomcat实例吗?


2

您不应该改变server.port来解决这个问题...

Mac/Unix/Linux用户: 如果在重启Tomcat后,这个问题仍然存在,那么很可能是因为Tomcat被不正确地关闭了,并且仍然有资源与其相关联被锁定。 您可以通过运行以下命令来查看这些资源的PIDs:

lsof | grep tomcat

使用以下方法终止这些进程:

kill -15 <PID>

这应该可以解决你的问题。

使用 kill -15 命令来终止进程,而不是使用 SIGKILL(-9)命令,这是更可取的。-15 开关会向进程发送信号,开始其关闭阶段并清理资源。


0

这通常发生在Tomcat的Connector / shutdown端口已经被占用的情况下。 首先,运行shutdown.bat(有时我们会忽略Tomcat的一个实例已经在运行)。 接下来,在命令提示符中运行

netstat -aon | findstr 0.0:<your port number which is giving bind exception>

获取当前正在使用你的端口的应用程序的 PID。要么关闭该应用程序,要么使用其他未列出的端口。

netstat -a -o -n

0
今天学到了一件事:服务器上其他人可以在端口80上启动IIS并且不告诉任何人。
如果您的Tomcat配置了相同的端口,它也会报告此错误。
需要更改IIS或Tomcat上的端口。
要修改IIS上的端口:
管理工具|Internet Information Services(IIS)管理器
右键单击默认网站|编辑绑定...
更改端口。
-或者-
要修改Tomcat中的端口:
打开conf\server.xml并更新标记中的端口值。
<Connector port="80" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443"
    URIEncoding="UTF-8"/>

重启Tomcat

享受2个Web服务。


0

同一端口上已经运行了其他Tomcat,最好使用9而不是15来终止它。

kill -9 PID

这对我很有帮助。


感谢您的贡献!但是,正如@cosbor11所写,在这种情况下最好先使用“TERM”杀死进程,并等待一段时间。这样可以让Tomcat优雅地关闭并释放其资源。只有在一段时间内仍然没有反应时,才可以使用“SIGKILL”进行强制杀死。您还可以尝试使用“pkill”命令。它允许您杀死所有与特定名称匹配的进程,因此您不需要PID。 - mzuther

0
一步一个空闲端口地更新所有可用的端口,这应该可以解决问题。

31-Jul-2019 16:28:30.641 SEVERE [main] org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:8005]: java.net.BindException: Address already in use: JVM_Bind


0

有其他东西正在使用端口8009。

要么关闭使用8009的东西,要么更改您的server.xml以使用不同于8009的另一个端口


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接