news 2026/6/15 6:27:00

Spring Boot 3.0 + Java 17 整合 Shiro 踩坑记:从 javax.servlet 到 jakarta.servlet 的完整迁移指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot 3.0 + Java 17 整合 Shiro 踩坑记:从 javax.servlet 到 jakarta.servlet 的完整迁移指南

Spring Boot 3.0 + Java 17 整合 Shiro 的完整迁移实战:从 javax.servlet 到 jakarta.servlet 的深度解析

最近在将一个老项目升级到 Spring Boot 3.0 和 Java 17 时,遇到了一个典型的"踩坑"场景:整合 Shiro 时抛出了ClassNotFoundException: javax.servlet.Filter错误。这个看似简单的错误背后,实际上隐藏着 Java EE 到 Jakarta EE 的演进历史。本文将带你深入理解这个问题,并提供一套完整的解决方案。

1. 问题背景与根源分析

当你在 Spring Boot 3.0 项目中尝试集成 Shiro 时,可能会遇到以下错误堆栈:

java.lang.ClassNotFoundException: javax.servlet.Filter at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)

这个错误的根源在于Servlet API 的包名变更。从 Java EE 到 Jakarta EE 的转变过程中,最显著的变化之一就是包名的迁移:

  • Java EE 时代javax.servlet.*
  • Jakarta EE 时代jakarta.servlet.*

Spring Boot 3.0 基于 Servlet 5.0 规范,已经完全迁移到了 Jakarta EE 9+ 的命名空间。而许多老版本的库(包括 Shiro 的某些模块)仍然使用旧的javax.servlet包名,这就导致了类加载失败。

提示:这个迁移不仅仅是简单的包名替换,还涉及到一些 API 的细微变化,因此需要特别注意兼容性问题。

2. 解决方案全景图

解决这个问题的完整方案包含以下几个关键步骤:

  1. 使用 Shiro 的 Jakarta 兼容版本:Shiro 1.11.0+ 提供了专门适配 Jakarta 的版本
  2. 排除冲突的依赖:确保项目中不会混用 javax 和 jakarta 版本的 Servlet API
  3. 验证依赖树:使用 Maven 或 Gradle 工具检查依赖关系

2.1 关键 Maven 配置

以下是经过验证的完整 pom.xml 配置片段:

<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <classifier>jakarta</classifier> <version>1.11.0</version> <!-- 排除仍使用了javax.servlet的依赖 --> <exclusions> <exclusion> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> </exclusion> <exclusion> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入适配jakarta的依赖包 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <classifier>jakarta</classifier> <version>1.11.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <classifier>jakarta</classifier> <version>1.11.0</version> <exclusions> <exclusion> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> </exclusion> </exclusions> </dependency>

2.2 配置解析

这个配置有几个关键点:

  • <classifier>jakarta</classifier>:指定使用 Jakarta 兼容版本
  • <exclusions>:排除仍然依赖 javax.servlet 的子模块
  • 版本一致性:确保所有 Shiro 组件使用相同版本

3. 深入理解依赖冲突

为了彻底解决问题,我们需要深入理解 Maven 依赖树。可以使用以下命令查看依赖关系:

mvn dependency:tree -Dincludes=org.apache.shiro

典型的依赖冲突场景可能如下表所示:

问题依赖冲突表现解决方案
shiro-core依赖 javax.servlet使用 jakarta 分类器版本
shiro-web传递依赖旧版 shiro-core显式排除并引入正确版本
shiro-spring内部依赖未迁移的组件排除后单独配置

注意:在实际项目中,可能还需要检查其他间接依赖是否引入了 javax.servlet API,确保完全清除所有冲突源。

4. 完整集成步骤

4.1 环境准备

确保你的开发环境满足以下要求:

  • JDK 17+
  • Spring Boot 3.0+
  • Maven 3.6+ 或 Gradle 7+

4.2 分步集成指南

  1. 添加基础依赖

    首先添加 Spring Boot 和 Shiro 的基础依赖:

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
  2. 配置 Shiro Jakarta 版本

    使用前面提供的完整配置添加 Shiro 依赖。

  3. 创建 Shiro 配置类

    @Configuration public class ShiroConfig { @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); // 配置 Realm 等组件 return securityManager; } @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); filterFactoryBean.setSecurityManager(securityManager); // 配置过滤规则 return filterFactoryBean; } }
  4. 验证配置

    启动应用并访问端点,确保没有出现类加载错误。

4.3 常见问题排查

如果按照上述步骤配置后仍然遇到问题,可以检查以下几点:

  • 依赖树是否干净:再次运行mvn dependency:tree确认没有 javax.servlet 残留
  • 版本一致性:确保所有 Shiro 组件版本一致
  • IDE 缓存问题:尝试清理并重新导入 Maven 项目

5. 迁移后的注意事项

成功迁移后,还需要注意以下事项:

  1. 测试覆盖:确保所有权限控制逻辑仍然正常工作
  2. 性能监控:观察系统性能,确保没有因版本变更引入性能问题
  3. 第三方集成:检查其他与 Shiro 集成的组件是否兼容 Jakarta 版本

在实际项目中,我还发现了一些有用的技巧:

  • 使用 Maven 的dependency:analyze目标可以帮助识别未使用的依赖
  • 在大型项目中,可以分模块逐步迁移,而不是一次性全部切换
  • 建立专门的测试用例来验证权限控制逻辑的正确性
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 6:23:04

避开这些坑:S32K344 FlexCAN初始化与邮箱配置的实战避坑指南

S32K344 FlexCAN实战避坑指南&#xff1a;从初始化陷阱到邮箱配置的深度解析在嵌入式系统开发中&#xff0c;CAN总线通信一直是工业控制、汽车电子等领域的核心通信协议。NXP S32K344芯片集成的FlexCAN模块作为支持CAN FD的高性能控制器&#xff0c;其灵活性和强大功能背后也隐…

作者头像 李华
网站建设 2026/6/15 6:19:51

主动学习在极端不平衡行星宜居性分类中的应用与优化

1. 项目概述&#xff1a;主动学习在极端不平衡行星宜居性分类中的应用在系外行星研究领域&#xff0c;我们面临着一个极具挑战性的数据科学问题&#xff1a;如何从数千颗已知系外行星中识别出极少数可能适合生命存在的行星。根据最新统计&#xff0c;在NASA系外行星档案记录的5…

作者头像 李华
网站建设 2026/6/15 6:17:52

Pandas读取CSV/Excel/JSON/HTML四大文件格式实战指南

1. 项目概述&#xff1a;为什么读取这四类文件是每个数据工作者的“呼吸式基本功”在真实的数据分析场景里&#xff0c;你永远不可能只面对一种格式的原始数据。我做过上百个企业级数据分析项目&#xff0c;从电商后台导出的Excel订单表、IoT设备上传的JSON日志、政府公开的HTM…

作者头像 李华
网站建设 2026/6/15 6:08:57

多维聚合中的数据变形术:重塑行、列、层、值四维结构

1. 这不是简单的“加总求平均”——多维聚合中的数据变形术到底在解决什么问题&#xff1f;如果你正在处理销售报表、用户行为宽表、IoT设备时序快照&#xff0c;或者哪怕只是Excel里一张带地区、月份、产品线、渠道四个维度的汇总表&#xff0c;那你大概率已经踩进过这个坑&am…

作者头像 李华