【Spring Boot 报错已解决】Web server failed to start. Port 8080 was already in use.

发布于:2025-09-07 ⋅ 阅读:(18) ⋅ 点赞:(0)

在这里插入图片描述

引言:

在Spring Boot开发过程中,启动应用时遇到端口被占用的情况是非常常见的问题,尤其是8080这个默认端口。对于开发者来说,当精心编写的代码准备运行测试时,却被"Web server failed to start. Port 8080 was already in use."这样的报错信息拦住去路,无疑会影响开发进度和心情。这个问题看似简单,但如果不了解其背后的原因和多种解决方法,可能会花费不少时间去排查。本文将深入探讨这个报错的产生原因,并提供多种实用的解决方法,帮助开发者快速解决该问题,让Spring Boot应用顺利启动。

一、问题描述:

在实际的开发场景中,很多开发者都曾遇到过端口被占用的问题。比如,有一位开发者在本地开发一个Spring Boot的Web应用,当他通过IDE(如IntelliJ IDEA、Eclipse)启动应用时,控制台突然抛出了"Web server failed to start. Port 8080 was already in use."的错误信息,应用启动失败。他检查了自己的代码,没有发现明显的配置或逻辑错误,这让他十分困惑。其实,这就是典型的端口被占用导致的Spring Boot启动失败案例。

1.1 报错示例:

当Spring Boot应用启动时,如果8080端口已被其他进程占用,控制台会输出类似以下的报错信息:

***************************
APPLICATION FAILED TO START
***************************

Description:

Web server failed to start. Port 8080 was already in use.

Action:

Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.

Process finished with exit code 1

1.2 报错分析:

从上述报错信息可以明确看出,问题的核心在于8080端口已经被其他进程占用。Spring Boot应用默认会使用8080端口来启动内嵌的Web服务器(如Tomcat),当该端口被其他程序(可能是另一个正在运行的Spring Boot应用、Tomcat服务器、或者其他任何使用8080端口的应用程序)占用时,当前的Spring Boot应用就无法正常绑定到8080端口,从而导致Web服务器启动失败,应用也就无法启动。

具体来说,在计算机网络中,每个端口就像一个通道,一个端口在同一时间只能被一个进程占用。当Spring Boot应用尝试启动并绑定8080端口时,操作系统会检查该端口的使用情况,如果发现已被占用,就会拒绝当前应用的绑定请求,进而导致应用启动失败。

1.3 解决思路:

解决"Port 8080 was already in use"的问题,主要有两个方向:
一是为当前的Spring Boot应用配置一个新的未被占用的端口,避开端口冲突。这是在开发环境中最推荐、最高效的解决方式,因为它允许你快速继续工作并避免终止其他可能有用的服务。
二是找到并停止正在占用8080端口的进程,释放该端口。这种方法适用于生产环境或确认该占用进程可以安全终止的情况。

基于这两个思路,可以衍生出多种具体的解决方法,接下来将详细介绍这些方法。

二、解决方法:

2.1 方法一:在Spring Boot配置文件中修改端口(推荐)

如果不想终止占用8080端口的进程,或者该进程是必要的,那么可以通过修改Spring Boot应用的配置文件,将应用的启动端口改为其他未被占用的端口。这是在开发环境中首选的解决方案。

Spring Boot支持多种配置文件格式,如application.properties、application.yml等,下面分别介绍在不同配置文件中修改端口的方法。

2.1.1 使用application.properties配置文件

在项目的src/main/resources目录下找到application.properties文件(如果没有可以自行创建),在文件中添加以下配置:

server.port=8081

这里将端口修改为8081,当然也可以根据实际情况修改为其他未被占用的端口,如8090、9000等。

2.1.2 使用application.yml配置文件

如果项目使用的是application.yml配置文件,同样在src/main/resources目录下找到该文件,添加或修改以下配置:

server:
  port: 8081

同样,8081可以替换为其他合适的端口。

修改配置文件后,重新启动Spring Boot应用,应用就会使用新配置的端口启动,从而避免端口冲突。

2.2 方法二:通过命令行查找并终止占用8080端口的进程

这种方法适用于熟悉命令行操作的开发者,通过命令可以快速定位占用端口的进程并将其终止。适用于生产环境或确认可以安全终止占用进程的情况。

2.2.1 Windows系统

在Windows系统中,可以按照以下步骤操作:

  1. 打开命令提示符(CMD)或PowerShell。
  2. 输入命令netstat -ano | findstr :8080,该命令的作用是查找所有使用8080端口的网络连接及其对应的进程ID(PID)。
    例如,可能会得到类似以下的输出:
    TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       1234
    TCP    [::]:8080              [::]:0                 LISTENING       1234
    
    其中,1234就是占用8080端口的进程ID。
  3. 找到进程ID后,输入命令taskkill /F /PID 1234(将1234替换为实际的进程ID),强制终止该进程。
    执行成功后,会显示"成功: 已终止 PID 为 1234 的进程。"

2.2.2 Linux或Mac系统

在Linux或Mac系统中,操作步骤如下:

  1. 打开终端。
  2. 输入命令lsof -i :8080,该命令用于列出占用8080端口的进程信息。
    可能的输出如下:
    COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
    java    12345  user   45u  IPv6  0x1234567890abcdef      0t0  TCP *:http-alt (LISTEN)
    
    其中,12345是进程ID。
  3. 输入命令kill -9 12345(将12345替换为实际的进程ID),强制杀死该进程。

通过这种方法,释放8080端口后,重新启动Spring Boot应用,通常就可以正常启动了。

2.3 方法三:通过命令行参数指定端口

除了在配置文件中修改端口外,还可以在启动Spring Boot应用时,通过命令行参数临时指定端口,这种方法非常灵活,适用于临时测试不同端口的情况。

2.3.1 使用jar包启动时指定端口

如果应用已经打包成jar包,可以在命令行中使用以下命令启动:

java -jar your-application.jar --server.port=8081

其中,your-application.jar是你的Spring Boot应用的jar包名称,8081是指定的新端口。

2.3.2 在IDE中通过命令行参数指定端口

在IntelliJ IDEA中,可以按照以下步骤设置:

  1. 点击菜单栏中的Run -> Edit Configurations…
  2. 在左侧找到你的Spring Boot应用的启动配置,点击进入。
  3. 在右侧的Program arguments中输入--server.port=8081
  4. 点击Apply和OK,然后启动应用,应用就会使用8081端口。

在Eclipse中,设置方法如下:

  1. 右键点击项目,选择Run As -> Run Configurations…
  2. 在左侧选择Java Application,找到你的应用配置。
  3. 在右侧的Arguments标签页中的Program arguments中输入--server.port=8081
  4. 点击Apply和Run,应用将使用指定的端口启动。

2.4 方法四:在代码中通过编程方式设置端口

在一些特殊场景下,可能需要通过代码来动态设置Spring Boot应用的端口。可以通过实现WebServerFactoryCustomizer接口来实现。这种方法适用于需要非常动态(例如,从数据库读取端口号)或程序化控制端口的特殊场景。

创建一个配置类,代码如下:

import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ServerConfig implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
    @Override
    public void customize(ConfigurableWebServerFactory factory) {
        // 设置端口为8081
        factory.setPort(8081);
        // 也可以将端口设置为0,让Spring Boot随机选择一个可用的端口,非常适合测试环境
        // factory.setPort(0);
    }
}

当Spring Boot应用启动时,会自动加载该配置类,将端口设置为8081。对于绝大多数只是需要改个端口的情况,不推荐使用此方法,因为配置文件和命令行参数更加灵活和标准。

三、其他解决方法

3.1 检查并关闭重复启动的应用

有时候,开发者可能会不小心多次启动同一个Spring Boot应用,导致第一个启动的应用占用了8080端口,后续启动的应用就会报错。这时,只需要在IDE中检查是否有多个相同应用的启动实例,关闭多余的实例即可。

在IntelliJ IDEA中,可以在底部的Run面板中查看正在运行的应用,右键点击不需要的应用,选择Stop即可。在Eclipse中,在底部的Console面板中,找到对应的应用进程,点击红色的停止按钮即可关闭。

3.2 检查防火墙设置

虽然这种情况比较少见,但防火墙的设置有时也可能影响端口的使用。如果防火墙对8080端口进行了限制,可能会导致应用无法正常绑定端口,或者误认为端口被占用。可以检查系统防火墙设置,确保8080端口(或修改后的端口)处于开放状态。

以Windows系统为例,打开"控制面板"->“系统和安全”->“Windows Defender防火墙”->“高级设置”,查看入站规则和出站规则中是否有对8080端口的限制,如果有,可以适当修改规则或开放该端口。

3.3 重启计算机

如果以上方法都无法解决问题,或者无法确定哪个进程占用了端口,重启计算机是一个简单但有效的方法。重启计算机后,所有进程都会被终止,端口会被释放,此时再启动Spring Boot应用,通常可以解决端口被占用的问题。

3.4 使用端口占用检测工具

除了命令行之外,还有一些图形化的端口占用检测工具可以帮助查找占用端口的进程,如TCPView(Windows)、lsof的图形化工具等。这些工具可以更直观地显示端口的占用情况,方便开发者操作。

以TCPView为例,启动该工具后,在列表中找到本地端口为8080的条目,对应的进程名称和PID会显示出来,右键点击该条目,选择"End Process"即可终止对应的进程。

四、总结:

本文详细探讨了Spring Boot应用启动时出现"Web server failed to start. Port 8080 was already in use."报错的原因及解决方法。该报错的核心原因是8080端口被其他进程占用,导致当前应用无法绑定该端口。

解决该问题的方法主要有两大类:一是为当前应用更换新的端口,二是释放被占用的8080端口。在开发环境中,修改应用端口通常是比终止现有进程更推荐的首选方案,因为它操作更简单、安全,并且允许多个应用同时运行。而在生产环境或确定占用端口的进程是无用的僵尸进程时,则可以采用终止进程的方法。

当下次再遇到这类报错时,开发者可以按照以下步骤进行排查和解决:

  1. 首选尝试在application.properties中修改server.port为其他值(如8081)并重启应用。
  2. 如果必须使用8080端口,再按照文中方法查找并终止占用进程。
  3. 若问题依旧,再依次检查防火墙、重复实例等问题。
  4. 对于测试环境,可以考虑使用server.port=0让Spring Boot随机分配端口,完美避免冲突。

通过掌握这些方法,开发者可以快速有效地解决Spring Boot应用端口被占用的问题,提高开发效率,减少因环境问题带来的困扰。在实际开发中,根据具体情况选择合适的解决方法,能够让开发过程更加顺畅。同时,在开发多个应用时,养成主动修改默认端口的习惯,可以有效避免端口冲突问题的发生。


网站公告

今日签到

点亮在社区的每一天
去签到