java - 尝试从 war 文件启动新应用程序时出现 java.net.BindException : Address already in use

标签 java tomcat centos war

我们的服务器已经有两个正在运行的应用程序,它们在使用 tomcat7centOS 服务器中正常运行。

我使用新应用程序上传了一个新的 war 文件,然后:

sh ./shutdown.sh
sh ./startup.sh

当我尝试使用新应用程序的端点从 postman 运行 API 时,我会在服务器的日志文件中得到:

07-Feb-2020 16:57:22.925 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [15,277] milliseconds
07-Feb-2020 16:57:22.927 SEVERE [main] org.apache.catalina.core.StandardServer.await Failed to create server shutdown socket on address [localhost] and port [8005] (base port [8005] and offset [0])
    java.net.BindException: Address already in use (Bind failed)
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
        at java.net.ServerSocket.bind(ServerSocket.java:390)
        at java.net.ServerSocket.<init>(ServerSocket.java:252)
        at org.apache.catalina.core.StandardServer.await(StandardServer.java:584)
        at org.apache.catalina.startup.Catalina.await(Catalina.java:721)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:667)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:343)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:474)
07-Feb-2020 16:57:22.927 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
07-Feb-2020 16:57:22.927 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
07-Feb-2020 16:57:22.927 INFO [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
07-Feb-2020 16:57:23.050 WARNING [1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [cef-authentication] appears to have started a thread named [mysql-cj-abandoned-connection-cleanup] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
07-Feb-2020 16:57:23.054 INFO [1] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
07-Feb-2020 16:57:23.054 INFO [1] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
07-Feb-2020 16:57:23.054 INFO [1] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
07-Feb-2020 16:57:23.054 INFO [1] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-8009"]
07-Feb-2020 16:57:23.059 INFO [17] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load [java.lang.ClassLoader]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
    java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [java.lang.ClassLoader]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1385)
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1373)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1226)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
        at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkThreadContextClassLoader(AbandonedConnectionCleanupThread.java:117)
        at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:84)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

您知道如何在不中断其他应用程序的情况下解决此问题吗?

最佳答案

此警告意味着您的应用程序正在尝试监听已被另一个进程使用的端口(在您的情况下为 localhost:8005)。

  • 如果该端口被另一个应用程序故意使用,那么您 对此无能为力(您不能在 相同的端口)。所以你应该改变这个应用程序的端口(例如 第8006章
  • 如果该端口不应被使用,例如由于某个原因而被使用 未正确结束的应用程序已离开正在运行的进程使用 netstat 找到该进程并杀死它。然后开始你的 再次申请。

关于java - 尝试从 war 文件启动新应用程序时出现 java.net.BindException : Address already in use,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60116044/

相关文章:

java - 如何访问 WEB-INF 文件夹外的 jdbc 属性文件(用于 Spring Security 配置)?

php - 检查最后修改的目录

linux - Git在本地保存远程连接的密码,通过root@连接

java - 在不使用 Spring <form :form> tag? 的情况下使用 Spring MVC 处理表单

java - Collections.sort() 使用比较器?

java - 有没有一种安全的方法来制作 HashSet<int[]> 而无需手动将其包装在另一个对象中?

linux - 为特定目录而不是用户设置 Umask 值

java - Android Activity 之间的信息传递

android - 如何将 Android 手机连接到本地服务器上运行的 Web 服务?

tomcat - 通过 Homebrew 启动时 Tomcat 的日志位置