You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类路径检测到2个Spring WebApplicationInitializers的启动问题求助

Spring Boot + Jetty + JSP 启动问题排查方案

问题现象

  • 启动时刷出大量JSTL类从多路径扫描的警告
  • 提示检测到2个Spring WebApplicationInitializers
  • 最终启动失败,抛出AbstractMethodError
  • 伴随端口占用提示

分步解决

1. 解决JSTL重复扫描警告

  • 检查pom.xml中的JSTL依赖,只保留一套有效依赖,删除重复或冲突的包(比如同时引入jstl-api和jstl-impl但未做依赖排除):
    <!-- 标准JSTL依赖配置,排除冲突的servlet/jsp api -->
    <dependency>
        <groupId>javax.servlet.jsp.jstl</groupId>
        <artifactId>jstl-api</artifactId>
        <version>1.2</version>
        <exclusions>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jstl-impl</artifactId>
        <version>1.2</version>
        <exclusions>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javax.servlet.jsp.jstl</groupId>
                <artifactId>jstl-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  • 添加Spring Web配置类,指定JSTL视图类,避免重复扫描:
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    
        @Bean
        public ViewResolver viewResolver() {
            InternalResourceViewResolver resolver = new InternalResourceViewResolver();
            resolver.setPrefix("/WEB-INF/views/");
            resolver.setSuffix(".jsp");
            resolver.setViewClass(JstlView.class);
            return resolver;
        }
    }
    

2. 解决WebApplicationInitializers冲突

  • 检查pom.xml,若同时引入spring-boot-starter-web和spring-boot-starter-jetty,必须排除web starter中的Tomcat依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>
    
  • 执行mvn dependency:tree生成依赖树,查找第三方依赖中是否自带WebApplicationInitializer实现,找到后排除对应依赖包。

3. 修复AbstractMethodError

  • 该错误多由依赖版本不兼容导致,重点验证版本匹配:
    • Spring Boot 2.x对应Jetty 9.x/10.x,避免跨大版本混用
    • javax.servlet-api版本需与Jetty兼容,Spring Boot 2.x建议使用4.0.1版本
  • 清理本地仓库脏依赖:mvn clean dependency:purge-local-repository,重新下载正确版本依赖。

4. 解决端口占用

  • 查找占用目标端口的进程:
    # Windows系统
    netstat -ano | findstr :<你的端口号>
    # Linux/Mac系统
    lsof -i :<你的端口号>
    
  • 杀掉对应进程后重新启动,或修改配置更换端口:
    # application.properties
    server.port=8081
    

验证步骤

  • 执行mvn dependency:tree,搜索jstl、jetty、spring-web相关依赖,确认无重复或版本冲突
  • 执行mvn clean清理编译文件,再用mvn spring-boot:run重新启动应用

内容的提问来源于stack exchange,提问作者htk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:27:05