【问题标题】:How to install JSTL? The absolute uri: http://java.sun.com/jstl/core cannot be resolved如何安装 JSTL?绝对uri:http://java.sun.com/jstl/core 无法解析
【发布时间】:2016-06-22 10:59:47
【问题描述】:

我不知道我做错了什么,但我不能包含 JSTL。我有 jstl-1.2.jar,但不幸的是我得到了异常:

org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:51)
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)
    at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:116)
    at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:315)
    at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:148)
    at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:429)
    at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:492)
    at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1439)
    at org.apache.jasper.compiler.Parser.parse(Parser.java:137)
    at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:255)
    at org.apache.jasper.compiler.ParserController.parse(ParserController.java:103)
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:170)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:332)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Thread.java:619)

我有:

  • pom.xml

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>
    
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    
  • web.xml

    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
      version="2.5">
    
  • index.jsp

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

【问题讨论】:

  • 我不得不在 jstl 旁边添加 taglibs depdendency 并且刚刚工作。

标签: jsp servlets jstl


【解决方案1】:

org.apache.jasper.JasperException: 绝对 uri:http://java.sun.com/jstl/core 无法在 web.xml 或随此应用程序部署的 jar 文件中解析

该 URI 用于 JSTL 1.0,但您实际上使用的是 JSTL 1.2,它使用带有附加 /jsp 路径的 URI(因为发明 EL 表达式的 JSTL 自 1.1 版起集成为 JSP 的一部分以共享/在纯 JSP 中重用 EL 逻辑)。

因此,根据JSTL documentation 相应地修复taglib URI:

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

您还需要绝对确定不会将多个不同版本的 JSTL JAR 文件一起放入运行时类路径中。这是 Tomcat 用户中很常见的错误。 Tomcat 的问题在于它不提供开箱即用的 JSTL,因此您必须手动安装它。这在普通 Jakarta EE 服务器中不是必需的。另见What exactly is Java EE?

在您的具体情况下,您的 pom.xml 基本上告诉您 jstl-1.2.jar 和 standard-1.1.2.jar 在一起。这是错误的。您基本上是在混合来自 Oracle 的 JSTL 1.2 API+impl 和来自 Apache 的 JSTL 1.1 impl。您应该只使用一种 JSTL 实现。

在 Tomcat 10+ 上安装 JSTL

如果您已经使用 Tomcat 10 或更新版本(第一个 Jakartified 版本,使用 jakarta.* 包而不是 javax.* 包),请通过此 sole 依赖项使用 JSTL 2.0:

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

非 Maven 用户可以通过将以下两个物理文件拖放到 Web 应用程序项目的 /WEB-INF/lib 文件夹中来实现相同的目的(绝对不要删除标准*.jar 或任何松散的 .tld 文件在那里!如有必要,请删除它们)。

在 Tomcat 9 上安装 JSTL-

如果您还没有使用 Tomcat 10,但仍使用 Tomcat 9 或更早版本,请通过此 sole 依赖项使用 JSTL 1.2(这与 Tomcat 9 / 8 / 7 / 6 / 5 但不老):

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

非 Maven 用户可以通过在 Web 应用程序项目的 /WEB-INF/lib 文件夹中删除以下两个物理文件来实现相同的目的(绝对不要删除标准*.jar 或任何松散的 .tld 文件在那里!如有必要,请删除它们)。

在普通 JEE 服务器上安装 JSTL

如果您实际上使用的是普通的 Jakarta EE 服务器,例如 WildFly、Payara、TomEE、GlassFish、WebSphere、OpenLiberty、WebLogic 等,而不是准系统 servlet 容器,例如 Tomcat、Jetty、Undertow 等,那么您不需要根本不需要显式安装 JSTL。普通的 Jakarta EE 服务器已经提供开箱即用的 JSTL。换句话说,您不需要将 JSTL 添加到pom.xml,也不需要在 webapp 中删除任何 JAR/TLD 文件。仅provided 范围内的 Jakarta EE 坐标就足够了:

<dependency>
    <groupId>jakarta.platform</groupId>
    <artifactId>jakarta.jakartaee-api</artifactId>
    <version><!-- 9.0.0, 8.0.0, etc depending on your server --></version>
    <scope>provided</scope>
</dependency>

确保 web.xml 版本正确

此外,您还应该确保您的web.xml 被声明为符合至少 Servlet 2.4,因此不是 Servlet 2.3 或更早版本。否则 JSTL 标记内的 EL 表达式将依次失效。选择与您的目标容器匹配的最高版本,并确保您的web.xml 中的任何位置都没有&lt;!DOCTYPE&gt;。这是一个与 Servlet 5.0 (Tomcat 10) 兼容的示例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="https://jakarta.ee/xml/ns/jakartaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
    version="5.0">

    <!-- Config here. -->

</web-app>

这是一个与 Servlet 4.0 (Tomcat 9) 兼容的示例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">

    <!-- Config here. -->

</web-app>

另见:

【讨论】:

  • 我已更改为 /jsp 并且:org.apache.jasper.JasperException:绝对 uri:java.sun.com/jsp/jstl/core 无法在 web.xml 中解析 ....
  • 那么你的类路径是一团糟。清理它。我不知道 maven 在做什么以及它是否聪明,但是对于 JSTL 1.2,您 不需要 需要 standard taglib。阅读标签信息页面了解更多详情。
  • 我真的很喜欢你整理的 JSTL wiki 页面。但是,由于这个问题是谷歌针对特定错误消息的热门问题,因此我冒昧地对其进行编辑并注意“非 jsp”URI 来自 JSTL 1.0。
  • 如果你使用 Gradle,添加这个依赖:compile('javax.servlet:jstl:1.2')
  • @BalusC in Intelij IDEA 在执行您提到的代码后,代码工作正常,但行 http://java.sun.com/jsp/jstl/core&lt;c:forEach&gt; 以红色表示,编辑器显示无法解决它们的错误。如何解决?我还需要在IDEA 的库上方添加其他地方吗
【解决方案2】:

@BalusC 是完全正确的,但是如果你仍然遇到这个异常,那说明你做错了什么。您将在 SO JSTL Tag Info 页面上找到最重要的信息。

基本上,这是处理此异常所需执行的操作的摘要。

  1. 查看web.xml中的servlet版本:&lt;web-app version="2.5"&gt;

  2. 检查此 servlet 版本是否支持 JSTL 版本:Servlet 版本 2.5 使用 JSTL 1.2 或 Servlet 版本 2.4 使用 JSTL 1.1

    李>
  3. 您的 servlet 容器必须具有适当的库,或者您必须手动将其包含在您的应用程序中。例如:JSTL 1.2 需要 jstl-1.2.jar

如何处理 Tomcat 5 或 6:

您需要将适当的 jar 包含到您的 WEB-INF/lib 目录(它仅适用于您的应用程序)或 tomcat/lib(将适用于所有应用程序)。

最后一件事是你的 jsp 文件中的 taglib。对于 JSTL 1.2,正确的是:

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

【讨论】:

  • 我注意到这个问题很受欢迎(很多观众)。所以这就是为什么我决定写一个简短的教程来处理这个问题
【解决方案3】:

我发现了导致此类错误的另一个原因:就我而言,有人将conf/catalina.properties 设置tomcat.util.scan.StandardJarScanFilter.jarsToSkip 属性设置为* 以避免日志警告消息,从而跳过了Tomcat 的必要扫描。将此更改回 Tomcat 默认值并添加要跳过的适当 jar 列表(不包括 jstl-1.2 或 spring-webmvc)解决了该问题。

【讨论】:

  • 是的!我也是。有人(=我自己)在某个时候将tomcat.util.scan.StandardJarScanFilter.jarsToSkip=* 放入catalina.properties 文件中(被误解了?)试图加快Tomcat 的启动时间。啊!
  • 我使用以下脚本来创建一个 jarsToSkip 列表,以避免 TLD 和 web-fragment jar:pastebin.com/3Bfm1u6K
  • 如果您不想更改您的jarsToSkip 设置,在它下面有一个jarsToScan 设置,它会覆盖jarsToSkip 中的任何内容。我们最终将taglibs*.jar 添加到我们的jarsToScan,因为我们的标签库是taglibs-standard-impl-1.2.5.jartaglibs-standard-spec-1.2.5.jar
  • 这是对我有用的答案。在conf/catalina.properties 中,我将tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar 更改为tomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jar 并修复了它。
  • 与此类似,可能在 META-INF/context.xml 中使用 禁用了 jar 扫描。
【解决方案4】:
  1. 下载jstl-1.2.jar
  2. 将此指令添加到您的页面:&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %&gt;

  3. 将 JAR 文件粘贴到您的 WEB-INF/lib 文件夹中。这应该有效。 (它 为我工作。)

【讨论】:

    【解决方案5】:
    jstl-1.2.jar --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    jstl-1.1.jar --> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
    

    还请检查您是否在 WEB-INF/lib 文件夹中添加了 javax.servlet.jarjavax.servlet.jsp.jstl-1.2.1.jar 的依赖项 jar。就我而言,这两个解决了这个问题。

    【讨论】:

    【解决方案6】:

    jstl-1.2.jar 添加到tomcat/lib 文件夹中。

    这样,您的依赖错误将再次得到修复。

    【讨论】:

      【解决方案7】:

      我只是想添加针对此问题找到的修复程序。我不确定为什么会这样。我有正确版本的 jstl (1.2) 以及正确版本的 servlet-api (2.5)

      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
      </dependency>
      

      我的页面中也有正确的地址,正如这个帖子中所建议的那样,即

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

      为我解决此问题的方法是从我的 pom 中的 xml 文件中删除我的 jstl 1.2 依赖项的范围标记。再次不确定为什么要修复它,但以防万一有人正在用 JPA 和 Hibernate 教程在复数视觉上做 spring 并以这种方式设置他们的 pom,请尝试删除范围标签,看看是否可以修复它。就像我说的那样,它对我有用。

      【讨论】:

        【解决方案8】:

        我已经提到 pom.xml 中的 Maven 依赖是错误的。应该是

            <dependency>
                <groupId>jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
        

        【讨论】:

        【解决方案9】:

        我完全禁用了 MAVEN 和 Spring 工具。而且我必须添加以下 jar 以使我的环境正常工作。

        • spring-aop-4.0.3.RELEASE.jar
        • spring-beans-4.0.3.RELEASE.jar(很难找到这个修复,其他 org.springframework 只是没有工作。
        • spring-context-4.0.3.RELEASE.jar
        • spring-core-4.0.3.RELEASE.jar
        • spring-expression-4.0.3.RELEASE.jar
        • spring-web-4.0.3.RELEASE.jar
        • spring-webmvc-4.0.3.RELEASE.jar
        • jstl-1.2.jar

        最糟糕的是jstl-api-1.2.jarjavax-servlet.jsp.jst-api-1.2.1.jar。他们只是没有工作。

        jstl-1.2.jar 运行良好。

        【讨论】:

        • +1 在我的头撞墙几个小时后,使用jstl-1.2 而不是jstl-1.2.1 也对我有用,我不知道为什么。
        【解决方案10】:

        如果你使用Spring boot,如果有的话,考虑从Application.properties中删除server.tomcat.additional-tld-skip-patterns=*.jar

        【讨论】:

          【解决方案11】:

          2021 年的答案

          这个问题仍然很受欢迎,但所有答案都严重过时了。所有 Java EE 组件都被拆分为多个 Jakarta 项目,JSTL 也不例外。因此,截至今天,这里是正确的 Maven 依赖项:

          <dependency>
              <groupId>jakarta.servlet.jsp.jstl</groupId>
              <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
              <version>1.2.7</version>
          </dependency>
          <dependency>
              <groupId>org.glassfish.web</groupId>
              <artifactId>jakarta.servlet.jsp.jstl</artifactId>
              <version>1.2.6</version>
          </dependency>
          

          是的,版本和 groupId 不匹配,但那是 quirk of the project's current state

          【讨论】:

          • 是的,但这并不能解决我的问题,但关闭,使用 tomcat10,您需要两个库 * taglibs-standard-impl-1.2.5-migrated-0.0.1.jar * taglibs-standard- spec-1.2.5-migrated-0.0.1.jar 这个库可以从 tomcat10 示例 webapps 中检索,也不要扫描 taglibs-standard* 因为 tld 文件在那里,这可以在 webapp META-CONF 的 context.xml 中禁用库
          【解决方案12】:

          刚刚在 Eclipse 中遇到了类似的问题 固定为:

          rightclick on project->Properties->Deployment Assembly->add Maven Dependencies
          

          之前有什么东西把它踢出来了, 在我编辑 pom.xml 时

          我有所有需要的 jar 文件,taglib uri 和 web.xml 没问题

          【讨论】:

          • 不知道为什么你没有得到爱,这是正确的解决方案
          【解决方案13】:

          这个问题中的所有答案都对我有帮助,但我想我会为后代添加一些额外的信息。

          原来我对 gwt-test-utils 有一个测试依赖项,它引入了 gwt-dev 包。不幸的是,gwt-dev 包含 Jetty、JSP、JSTL 等的完整副本,它在类路径上的正确包之前。因此,即使我对 JSTL 1.2 有适当的依赖关系,它也会将 1.0 版本加载到 gwt-dev 内部。发牢骚。

          对我来说,解决方案是不要在测试范围内运行,所以我不会在运行时选择 gwt-test-utils 包。以其他方式从类路径中删除 gwt-dev 包也可以解决问题。

          【讨论】:

            【解决方案14】:

            这对我有用

                <groupId>jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            

            【讨论】:

              【解决方案15】:

              我有同样的问题,我正在使用 eclipse,以防其他人遇到同样的问题:
              在eclipse中双击tomcat服务器,
              停止服务器
              取消勾选“不发布的服务器模块”
              启动服务器。

              【讨论】:

                【解决方案16】:

                解决了 Netbeans 12.3 和 Tomcat 9.0 中的相同问题:

                1.在pom.xml中写入:

                <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId><version>1.2</version>
                </dependency>
                

                2.在项目中添加jstl-1.2.jar。

                3.手动安装神器(选择jstl-1.2.jar-从网上下载)

                【讨论】:

                  【解决方案17】:

                  通过选择解决了 IBM RAD 7.5 中的类似问题:

                  1. 项目属性
                  2. 项目方面
                  3. JSTL 复选框

                  【讨论】:

                    猜你喜欢
                    • 2010-12-26
                    • 2020-11-10
                    • 2014-09-03
                    • 2013-04-28
                    • 2022-11-22
                    • 2013-10-27
                    • 2011-08-05
                    相关资源
                    最近更新 更多