jakarta.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator

jakarta.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator

我正在尝试使用 JSTL 执行 JSP,但我无法执行。我有 Apache Tomcat 10,即 jakarta.servlet.* 而不是 javax.servlet.*。因此,每当我使用 JSTL 1.2.5 文件执行 Web 应用程序时,都会收到错误消息:

jakarta.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:778)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

我试图在网上找到类似的 problem/question 已解决,但找不到。我如何在 JSP 和 Tomcat 10 中使用 JSTL?

我的索引JSP文件代码:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<html>  
  <head>  
    <title>Tag Example</title>  
  </head>  
  <body>  
    <c:out value="${'Hello Yo'}"/> 
  </body>  
</html>  

Jakarta EE 9 版本的 JSTL 可用作 JSTL 2.0 here.

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>2.0.0</version>
</dependency>

这是 JSTL 2.0 的参考实现,目前也在 GlassFish 6.0 中使用(最初来自 Sun,然后归 Oracle,然后归 Eclipse)。通常 Apache 也有自己的实现,但它还不能作为 JSTL 2.0(还没有?)。

为了完整起见,并确认, JSTL 2.0 的标签库 URI still 引用原始 java.sun.com 主机,而您凭直觉希望它也被迁移到 xmlns.jcp.org 甚至 jakarta.ee.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

另请参阅:

对于您的配置,您将需要这两个文件以使 JSTL 正常工作:

如果将它们放在项目的 lib 文件夹中,那么它将仅适用于该应用程序。所以我建议您将它们放在 TomCat 应用程序 (.../apache-tomcat-10.0.6/lib/) 的 lib 文件夹中以及其他 jar 文件中。

This 是一个很好的话题,讨论的很详细。

对于像我一样曾经迷路的人:你需要下载最新版本的taglibsjslt(连同它们的依赖)!

事情是这样的:

  1. Download the latest taglibs from Apache for Tomcat 10

  2. Download the latest jslt and dependencies - EXCEPT for jakarta.servlet-api-5.0.0.jar ()

  3. 将下载的 JAR 移动到项目 WEB-INF/lib 文件夹中,它应该如下所示:

.
+-- _WEB-INF
|   +-- lib
|       +-- jakarta.activation-2.0.0.jar
|       +-- jakarta.el-api-4.0.0.jar
|       +-- jakarta.servlet.jsp.jstl-2.0.0.jar
|       +-- jakarta.servlet.jsp.jstl-api-2.0.0.jar
|       +-- jakarta.xml.bind-api-3.0.0.jar
|       +-- taglibs-standard-compat-1.2.5.jar
|       +-- taglibs-standard-impl-1.2.5.jar
|       +-- taglibs-standard-spec-1.2.5.jar