如何将JSTL从javax升级到jakarta?解决ExpressionEvaluatorManager适配问题
解决Tomcat10/Java11升级中ExpressionEvaluatorManager的兼容问题
问题根源
你遇到的错误是因为standard.jar中的ExpressionEvaluatorManager依赖旧的javax.servlet.jsp命名空间,而Tomcat10及Java EE 9+已全面切换到jakarta命名空间,且该类在Jakarta版本的Apache Taglibs标准库中已被移除——它属于旧版JSP的非规范内部工具,Jakarta EE官方不再维护,转而推荐使用标准EL表达式API。
解决方案
1. 替换依赖包
移除旧的standard.jar,改用Jakarta兼容的Apache Taglibs标准库:
- 若使用Maven,添加以下依赖(版本选最新稳定版,如1.2.5):
<dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-spec</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.5</version> <scope>runtime</scope> </dependency>
- 手动管理jar包的话,直接下载这两个jar替换旧的
standard.jar。
2. 替换ExpressionEvaluatorManager的代码实现
用Jakarta EE标准的EL表达式API替代原有调用逻辑。假设你原来的代码是:
import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager; // 原有调用 return ExpressionEvaluatorManager.evaluate(name, (String) value, targetClass, pageContext);
替换为以下标准实现:
import jakarta.servlet.jsp.JspFactory; import jakarta.el.ELContext; import jakarta.el.ExpressionFactory; import jakarta.el.ValueExpression; // 新的EL求值逻辑 ExpressionFactory factory = JspFactory.getDefaultFactory() .getJspApplicationContext(pageContext.getServletContext()) .getExpressionFactory(); ELContext elContext = pageContext.getELContext(); ValueExpression expression = factory.createValueExpression(elContext, (String) value, targetClass); return expression.getValue(elContext);
3. 其他注意事项
- 确保项目中所有
javax开头的JSP/Servlet相关导入都替换为jakarta开头(比如javax.servlet.jsp.PageContext→jakarta.servlet.jsp.PageContext)。 - Tomcat10自带了Jakarta EE的Servlet/JSP API,无需额外引入
jakarta.servlet-api或jakarta.jsp-api依赖,避免版本冲突。
内容的提问来源于stack exchange,提问作者Borea Deitz
相关产品推荐
相关产品推荐

