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

SpringBoot3.0+Java17集成Apache Shiro遭遇NoClassDefFoundError求助

问题分析与解决方案

核心原因:版本兼容性问题

是的,这完全是依赖版本不兼容导致的:

  • Spring Boot 3.x 基于 Jakarta EE 9+,所有Servlet相关API的包名从javax.servlet迁移到了jakarta.servlet;
  • Apache Shiro 1.10.0 仍依赖传统Java EE的javax.servlet命名空间API,和Spring Boot 3的Jakarta环境不匹配,所以抛出NoClassDefFoundError: javax/servlet/Filter;
  • 手动添加javax.servlet-api会和Spring Boot 3自带的Jakarta Servlet API产生类路径冲突,导致过滤器逻辑被覆盖或失效。

而Java 8 + Spring Boot 2.x的组合正常,是因为Spring Boot 2.x基于Java EE(javax命名空间),和Shiro 1.10.0的依赖完全匹配,没有冲突。


Java 17 + Spring Boot 3 搭配 Apache Shiro 的解决方案

1. 升级Shiro到适配Jakarta EE的版本

Apache Shiro从1.11.0版本开始全面迁移到Jakarta命名空间,完美兼容Spring Boot 3和Java 17。直接替换Shiro依赖为1.11.0及以上版本即可,无需手动添加javax.servlet-api。

Maven依赖配置:
<!-- Shiro Spring Boot Web Starter(适配Jakarta) -->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-web-starter</artifactId>
    <version>1.11.0</version>
</dependency>
Gradle依赖配置:
implementation 'org.apache.shiro:shiro-spring-boot-web-starter:1.11.0'

2. 调整Shiro配置类的导入包

如果自定义了过滤器或使用了Servlet相关API,确保导入的是jakarta.servlet下的类,而非javax.servlet:

// 正确导入
import jakarta.servlet.Filter;
// 错误导入(需删除)
// import javax.servlet.Filter;

3. 验证FilterChain配置

确保路径规则配置正确,示例如下:

@Configuration
public class ShiroConfig {

    @Bean
    public DefaultWebSecurityManager securityManager(Realm realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        return securityManager;
    }

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean filterFactory = new ShiroFilterFactoryBean();
        filterFactory.setSecurityManager(securityManager);

        // 配置过滤链:LinkedHashMap保证顺序
        Map<String, String> filterChainMap = new LinkedHashMap<>();
        // 放行登录等无需认证的接口
        filterChainMap.put("/login", "anon");
        // 保护/update和/add接口,需认证
        filterChainMap.put("/update", "authc");
        filterChainMap.put("/add", "authc");
        // 其余接口默认需认证
        filterChainMap.put("/**", "authc");

        filterFactory.setFilterChainDefinitionMap(filterChainMap);
        return filterFactory;
    }

    // 自定义Realm等其他配置...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:43:15