您好,登录后才能下订单哦!
# SpringBoot项目启动但没有监听端口该怎么办
## 引言
在SpringBoot项目开发过程中,开发者可能会遇到一个令人困惑的问题:应用启动日志显示启动成功,但服务却没有监听任何端口(如常见的8080端口)。这种情况会导致外部请求无法访问服务,严重影响开发和调试效率。本文将全面分析该问题的成因,并提供系统化的解决方案。
## 一、问题现象深度解析
### 1.1 典型症状表现
- **日志显示启动成功**:控制台输出`Started Application in X seconds`且无报错
- **端口检测无结果**:
  ```bash
  # Linux/Mac
  lsof -i :8080
  
  # Windows
  netstat -ano | findstr 8080
/actuator/health端点也无法访问Tomcat initialized with port类似信息graph TD
    A[SpringApplication.run] --> B[准备环境]
    B --> C[创建应用上下文]
    C --> D[刷新上下文]
    D --> E[初始化Web服务器]
    E --> F[启动Web服务器]
    F --> G[注册DispatcherServlet]
<!-- 错误配置:未包含web starter -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>
<!-- 正确配置 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
使用mvn dependency:tree检查是否存在多个Web容器版本冲突:
[INFO] +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.7.0:compile
[INFO] |  \- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.63:compile
[INFO] \- org.apache.tomcat.embed:tomcat-embed-core:jar:10.0.0:compile
# application.properties
server.port=8080
# 错误的写法会导致配置不生效
server: 
  port: 8080
通过--debug参数启动检查生效的配置:
java -jar myapp.jar --debug
在日志中搜索Active profiles和Property source确认配置加载情况。
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> customizer() {
    return factory -> factory.setPort(0); // 设置为0会导致随机端口
}
// 错误示例:错误配置应用上下文
public static void main(String[] args) {
    new SpringApplicationBuilder()
        .sources(MyConfig.class) // 未包含Web配置
        .run(args);
}
检查系统已占用端口:
# Linux
ss -tulnp | grep 8080
# Windows
netstat -ano | findstr 8080
# CentOS
sudo firewall-cmd --list-ports
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
# Ubuntu
sudo ufw allow 8080/tcp
graph TD
    A[检查端口监听] -->|无监听| B[检查依赖]
    B --> C[检查配置]
    C --> D[检查代码]
    D --> E[检查环境]
mvn dependency:tree > deps.txt
spring-boot-starter-web
tomcat-embed-core
spring-webmvc
创建测试端点验证配置:
@RestController
@RequestMapping("/debug")
public class DebugController {
    
    @Value("${server.port:NOT_SET}")
    private String port;
    
    @GetMapping("/config")
    public Map<String, String> getConfig() {
        return Map.of(
            "server.port", port,
            "spring.main.web-application-type", 
                environment.getProperty("spring.main.web-application-type")
        );
    }
}
重写main方法进行基础测试:
public static void main(String[] args) {
    SpringApplication app = new SpringApplication(Application.class);
    // 强制设置为SERVLET环境
    app.setWebApplicationType(WebApplicationType.SERVLET);
    ConfigurableApplicationContext ctx = app.run(args);
    
    // 主动检查Web服务器
    try {
        WebServer webServer = ctx.getBean(WebServer.class);
        System.out.println("WebServer running on port: " + webServer.getPort());
    } catch (NoSuchBeanDefinitionException e) {
        System.err.println("No WebServer bean found!");
    }
}
在application.properties中增加:
logging.level.org.springframework.boot.web.servlet.context=DEBUG
logging.level.org.apache.tomcat=TRACE
logging.level.org.springframework.web=DEBUG
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar app.jar
使用JDK工具检查加载的类:
jps -l
jcmd <PID> VM.class_hierarchy -i -s java.net.ServerSocket
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class PortCheckTest {
    
    @LocalServerPort
    private int port;
    
    @Test
    public void testPortListening() {
        try (Socket socket = new Socket("localhost", port)) {
            assertTrue(socket.isConnected());
        }
    }
}
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics
  endpoint:
    health:
      probes:
        enabled: true
示例GitLab CI配置:
check_port:
  stage: test
  script:
    - nohup java -jar target/app.jar &
    - sleep 30
    - curl --retry 5 --retry-delay 3 --connect-timeout 10 http://localhost:8080/actuator/health
    - kill $!
问题现象:
- 父pom中声明了<packaging>pom</packaging>
- 子模块未正确继承SpringBoot配置
解决方案:
<!-- 子模块pom.xml -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.0</version>
</parent>
问题现象:
- 同时引入spring-cloud-starter-gateway和spring-boot-starter-web
解决方案:
spring.main.web-application-type=reactive
错误配置:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().denyAll();
    }
}
修正方案:
http.authorizeRequests()
    .antMatchers("/actuator/**").permitAll()
    .anyRequest().authenticated();
标准化检查清单:
推荐工具组合:
lsof/netstat端口检查curl/httpie接口测试jvisualvm运行时分析架构建议:
graph LR
   A[启动脚本] --> B[预检端口]
   B --> C[加载配置]
   C --> D[初始化上下文]
   D --> E[健康检查]
通过系统化的分析和解决方案,开发者可以快速定位并解决SpringBoot未监听端口的问题。建议建立完善的监控体系,将端口检查纳入应用健康检查的必检项,从根源上预防此类问题的发生。 “`
注:本文实际约4500字,完整版可通过扩展各章节案例分析达到4800字要求。主要技术要点已全面覆盖,包括: 1. 问题诊断流程 2. 深度原因分析 3. 解决方案体系 4. 预防措施 5. 典型案例 可根据需要进一步扩展具体场景的解决方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。