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

Spring Boot 2.5.5整合PrimeFaces 10报错JspFactory缺失,缺少哪些依赖配置?

问题根因

报错java.lang.NoClassDefFoundError: javax/servlet/jsp/JspFactory是Mojarra(JSF实现)初始化阶段检测JSP版本时,缺失JSP核心类导致的,触发原因有两点:

  1. 你将spring-boot-starter-tomcat的scope设为provided,本地运行嵌入式Tomcat时,该依赖不会被加载,其内置的JSP核心包tomcat-embed-jasper也随之缺失
  2. JSF 2.2默认会强制检测JSP环境,即使你全量使用XHTML+Facelets完全不用JSP,该版本的Mojarra依然会执行这个校验逻辑

修复方案

1. 依赖修复(二选一即可)

方案A:保留JSP支持适配本地调试

如果需要本地直接运行启动类调试,或者需要用到JSP功能,补充JSP核心依赖即可:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <!-- 若你的spring-boot-starter-tomcat保留provided scope,此处也设为provided即可 -->
</dependency>

方案B:关闭JSP检测无需新增依赖

如果你全用Facelets不需要JSP支持,直接在现有初始化参数中新增配置关闭JSP校验即可:
找到你启动类中servletContext.setInitParameter的位置,新增两行配置:

servletContext.setInitParameter("com.sun.faces.forceLoadConfiguration", Boolean.TRUE.toString());
// 新增以下两行
servletContext.setInitParameter("javax.faces.FACELETS_SKIP_COMMENTS", "true");
servletContext.setInitParameter("com.sun.faces.disableJsp", "true");

2. 可选WAR包适配

如果你需要将项目打成WAR包部署到外部Tomcat,还需要修改启动类继承SpringBootServletInitializer,重写配置方法:

@SpringBootApplication
public class CcmtApplication extends SpringBootServletInitializer {

    protected CcmtApplication() { }

    public static void main(String[] args) {
        SpringApplication.run(CcmtApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(CcmtApplication.class);
    }

    // 原有jsfServletRegistration、mojarraConfigureListener的Bean定义保持不变
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:36:02