【问题标题】:java.lang.NoClassDefFoundError: jakarta/servlet/jsp/jstl/core/LoopTag in Tomcat 10java.lang.NoClassDefFoundError:Tomcat 10 中的 jakarta/servlet/jsp/jstl/core/LoopTag
【发布时间】:2021-10-12 03:11:00
【问题描述】:

我刚刚迁移到 Tomcat 10。将 javax.servlet 包的所有引用更改为 jakarta.servlet 后,我​​仍然无法运行我的应用程序。

我已经从Here 下载了 JSTL 2.0 类库并将它们添加到类路径中。 我正在使用带有 Ant 的 NetBeans。 这是我的类库:

这是我添加的 JSTL jar 文件:

它抛出以下异常:

Type Exception Report

Message java.lang.NoClassDefFoundError: jakarta/servlet/jsp/jstl/core/LoopTag

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

jakarta.servlet.ServletException: java.lang.NoClassDefFoundError: jakarta/servlet/jsp/jstl/core/LoopTag
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:332)
    jakarta.servlet.http.HttpServlet.service(HttpServlet.java:770)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    com.xyneex.post.PostFilter.doFilter(PostFilter.java:163)

Root Cause

java.lang.NoClassDefFoundError: jakarta/servlet/jsp/jstl/core/LoopTag
java.base/java.lang.ClassLoader.defineClass1(Native Method)
java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1010)
java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2470)
org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:866)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1370)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1224)
org.apache.jasper.compiler.Parser.parseCustomTag(Parser.java:1232)
org.apache.jasper.compiler.Parser.parseElements(Parser.java:1464)
org.apache.jasper.compiler.Parser.parse(Parser.java:138)
org.apache.jasper.compiler.ParserController.doParse(ParserController.java:244)
org.apache.jasper.compiler.ParserController.parse(ParserController.java:105)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:207)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:392)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:368)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:352)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:400)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:770)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
com.xyneex.post.PostFilter.doFilter(PostFilter.java:163)

Root Cause

java.lang.ClassNotFoundException: jakarta.servlet.jsp.jstl.core.LoopTag
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1401)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1224)
java.base/java.lang.ClassLoader.defineClass1(Native Method)
java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1010)
java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2470)
org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:866)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1370)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1224)
org.apache.jasper.compiler.Parser.parseCustomTag(Parser.java:1232)
org.apache.jasper.compiler.Parser.parseElements(Parser.java:1464)
org.apache.jasper.compiler.Parser.parse(Parser.java:138)
org.apache.jasper.compiler.ParserController.doParse(ParserController.java:244)
org.apache.jasper.compiler.ParserController.parse(ParserController.java:105)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:207)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:392)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:368)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:352)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:400)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:770)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
com.xyneex.post.PostFilter.doFilter(PostFilter.java:163)

Note The full stack trace of the root cause is available in the server logs.

我的 JSP/HTML 代码:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="home" value="active" scope="request" />
<!DOCTYPE html>
<html>
    <head>
        <title>Xyneex Technologies | Home </title>
        <jsp:include page="WEB-INF/fragments/head.jsp" />
        <style>
     ...

我在 StackOverflow 中看到过类似的问题,但他们谈论的是 Tomcat 7。

我正在使用带有 JDK 16 的 Tomcat 10。

请问有什么办法解决这个问题?

编辑:

根据建议,This Question and Answer 与我的问题不同。作为答案地址 JSTL URI,我已经检查并确认我使用的是正确的 URI。我坚信问题与我的 JSTL 库中不正确的 JSTL jar 文件有关,我无法确定要使用哪些。

编辑 2:

经过几个小时的挖掘,我找到了我在回答中提供的解决方案。 感谢您的建议。

编辑 3:

This Answer by BalusC 似乎解决了 Tomcat 10 的问题。请确保在阅读答案时向下滚动到 Tomcat 10 部分。我第一次肯定错过了,因为我以为他只谈论了 URI。

感谢Piotr P. Karwasz为我指出。

【问题讨论】:

  • 您缺少依赖项:jakarta.servlet.jsp.jstl-api。要在 Tomcat 10 中使用 JSTL,您实际上需要两个(并且只有两个)工件(参见 this answer)。
  • 阅读您的更新后,我可以说前面提到的answer by BalusC 不仅仅处理 XML 命名空间。它为您提供了必须在各种 Tomcat 版本及其下载链接中使用的确切依赖项。答案很长,但值得一读。
  • 对不起,我的错,我似乎停在他谈到 URI 问题的部分。但是我已经以自己的方式解决了它。稍后我会回去测试他的 Tomcat 10 解决方案。

标签: java jsp jstl jsp-tags tomcat10


【解决方案1】:

我终于找到了解决办法!

我能够下载所需的jar文件here

对于可能遇到相同问题的人: 请注意:添加 jar 文件时,不要包含 jakarta.servlet-api-5.0.0.jar 文件。 Tomcat 10 已经有一个具有相同类的类似 jar 文件,这引起了另一个头痛。 我创建了一个新库并将其命名为 JSTL 2.0

下面是我添加到类路径中的 jar 文件的屏幕截图。

这对我来说很好用!

【讨论】:

    【解决方案2】:

    您可以将JSTL1.2库添加到您的应用程序中,如下所示,将jstl-impl.jar和jstl-api.jar添加到应用程序中

    指定 JSTL 核心库的 taglib 指令:

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

    文件下载链接

    http://www.java2s.com/Code/Jar/j/Downloadjstlapi12jar.htm http://www.java2s.com/Code/Jar/j/Downloadjstlimpl12jar.htm

    不要忘记将这两个 jar 文件添加到 META-INF/lib,如果没有您放入应用程序中的所有这些文件,它也可以正常工作

    【讨论】:

    • 这是我以前的。这不适用于 Tomcat 10,它会引发错误。从您向我展示的图像来看,您使用的是 Tomcat 8。
    • 它不依赖于tomcat版本,而且Tomcat从来没有包含JSTL在WEB-INF/lib中添加两个jar,我检查了你上面放的图像,我没有意识到jstl-api jar文件在哪里,请查看权限
    • @chu3la:由于javax.* -> jakarta.* 命名空间迁移,JSTL 1.2 不适用于 JSP 3.0(在 Tomcat 10 中)。因此,您需要安装的 JSTL 版本确实取决于 Tomcat 的版本。
    • 我已经使用了我上面给你的指令并且运行良好,此外,我检查了我在咨询 Project Facets 时发现的 4.0 的 JSP 版本
    猜你喜欢
    • 2017-03-29
    • 2012-09-23
    • 2011-12-24
    • 2016-01-04
    • 1970-01-01
    • 2021-09-28
    • 2014-03-02
    相关资源
    最近更新 更多