2019 年一个响应式 Spring Cloud Gateway 工程出现 Web 栈依赖冲突。当前模块的 POM 没有直接声明 spring-boot-starter-web,继续看依赖树,发现它是 common 模块带进来的。

先定位传递路径

在相关 Maven 模块中检查:

mvn dependency:tree -Dincludes=org.springframework.boot:spring-boot-starter-web

最终解析到的依赖与当前 POM 直接列出的依赖不同。公共包、父 POM、profile 和其他模块都可能影响结果,因此应保存完整路径再调整。

在引入 common 的依赖边上排除

以下为结构示例,坐标和版本需换成项目实际值:

<dependency>
  <groupId>com.example</groupId>
  <artifactId>example-common</artifactId>
  <version>1.0.0</version>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </exclusion>
  </exclusions>
</dependency>

Maven exclusion 是按依赖路径配置的,不是把某个库从整个项目全局禁用。如果还有另一条路径引入相同组件,仍要继续检查。Maven 可选依赖与排除说明

排除后,还要检查 common 自己依赖什么

如果 common 的代码确实调用了 MVC 类型,排除后可能出现缺类。更长期的处理是把通用代码和特定 Web 栈集成拆开,而不只是让启动日志暂时安静。

确认实际使用的是响应式 Gateway 运行栈,再核对 Spring Boot、Spring Cloud 和 Gateway 的配套版本。不同网关产品与新旧运行栈不能套用同一条“都不能有 Web Starter”的结论。

重新构建后检查依赖树、启动、路由、过滤器及公共组件调用。删掉一个 artifact 只是变更,只有这些行为符合预期,才说明依赖调整没有引入新的问题。