如何安装JSTL?绝对uri:http://java.sun.com/jstl/core无法解析


134

我不知道我做错了什么,但是我不能包括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>

4
我也必须在jstl旁边添加taglibs依赖关系,并且可以正常工作。
Christian Vielma 2013年

Answers:


193

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的一部分集成在一起,以便在其中共享/重用EL逻辑。普通的JSP)。

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

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

此外,您需要绝对确保不要将多个不同版本的JSTL JAR文件一起扔到运行时类路径中。这是Tomcat用户之间的常见错误。Tomcat的问题在于它没有提供现成的JSTL,因此您必须手动安装它。在普通的Java EE服务器中,这不是必需的。另请参见Java EE到底是什么?

在您的特定情况下,pom.xml基本上告诉您同时拥有jstl-1.2.jar和standard-1.1.2.jar。错了 您基本上是将Oracle的JSTL 1.2 API + impl与Apache的JSTL 1.1 impl混合使用。您需要删除任何内容standard-xxx.jar。只是唯一jstl-1.2.jar就足够了。

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

非Maven用户可以通过将物理jstl-1.2.jar文件拖放/WEB-INF/lib到Web应用程序项目的文件夹中来实现相同目的(绝对不要在其中拖放standard.jar或任何松散的.tld文件!)。如有必要,将其删除。

如果您实际上使用的是普通的Java EE服务器(如WildFly,Payara等)而不是诸如Tomcat,Jetty等的准系统servlet容器,那么您根本不需要显式安装JSTL。普通的Java EE服务器已经提供了JSTL。换句话说,您无需向pom.xmlWebapp中添加JSTL 或删除任何JAR / TLD文件。仅provided限定范围的Java EE坐标就足够了:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version><!-- 8.0, 7.0, etc depending on your server --></version>
    <scope>provided</scope>
</dependency>

此外,您还应确保web.xml声明的声明至少符合Servlet 2.4,因此不符合Servlet 2.3或更早的版本。否则,JSTL标记内的EL表达式将无法正常工作。选择与目标容器匹配的最高版本,并确保您的容器中没有<!DOCTYPE>任何位置web.xml。这是一个与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中解析..
lukastymo 2011年

4
然后,您的类路径变得一团糟。清理它。我不知道是什么Maven是做什么,无论是聪明的,但JSTL 1.2你没有所需要的standard标签库。阅读标签信息页面以获取更多详细信息。
BalusC

4
我真的很喜欢您放在一起的JSTL Wiki页面。但是,由于这个问题是Google针对特定错误消息的热门话题,因此我可以自由地对其进行编辑,并注意“ non-jsp” URI来自JSTL 1.0。
kdgregory 2012年

2
@kdgregory:谢谢:)
BalusC

1
如果您使用的是Gradle,请添加以下依赖项:compile('javax.servlet:jstl:1.2')
benscabbia

36

@BalusC是完全正确的,但是如果仍然遇到此异常,则表示您做错了什么。您将在SO JSTL标记信息页面上找到最重要的信息。

基本上,这是您需要处理此异常的摘要。

  1. 检查web.xml中的servlet版本: <web-app version="2.5">

  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:

您需要在WEB-INF / lib目录(仅对您的应用程序起作用)或tomcat / lib(对所有应用程序全局起作用)中包含适当的jar。

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

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

3
我注意到这个问题很受欢迎(许多观众)。所以这就是为什么我决定写简短的教程来解决这个问题的原因
lukastymo 2011年

17

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


是!。我也是。有人(=我)在某些时候放tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*catalina.properties一个文件(误解?)试图加快Tomcat的启动时间。啊!
peterh 2013年

我使用以下脚本创建了一个jarsToSkip列表,该列表避免了TLD和Web碎片罐:pastebin.com/3Bfm1u6K
Moreaki

1
如果您不想更改jarsToSkip设置,则在其下方有一个jarsToScan设置会覆盖中的任何内容jarsToSkip。我们最终添加taglibs*.jar到我们jarsToScan的taglib taglibs-standard-impl-1.2.5.jar和中taglibs-standard-spec-1.2.5.jar
jabe

1
这是对我有用的答案。在中conf/catalina.properties,我更改tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar为,tomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jar并对其进行了修复。
加里·

15
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" %>

已添加也请检查的依赖罐子javax.servlet.jar,并javax.servlet.jsp.jstl-1.2.1.jar在你的WEB-INF / lib文件夹或没有。就我而言,这两个解决了问题。




10
  1. 下载jstl-1.2.jar
  2. 将此指令添加到您的页面: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  3. 将JAR文件粘贴到WEB-INF / lib文件夹中。这应该工作。(对我有用。)



3

我只想添加针对此问题找到的修复程序。我不确定为什么这样做。我有正确版本的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" %>

对我来说解决此问题的原因是从jstl 1.2依赖项的pom中的xml文件中删除了作用域标记。再次不确定为什么要解决此问题,但以防万一有人用复数视力在JPA和Hibernate教程上做了春天,并以此方式设置了pom,请尝试删除scope标记,看看是否可以解决。就像我说的那样对我有用。


2

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

  • spring-aop-4.0.3.RELEASE.jar
  • spring-beans-4.0.3.RELEASE.jar(很难找到此修复程序,其他org.springframework <3.versions>却无法正常工作。
  • 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
+1在将我的头撞在墙上几个小时之后,使用jstl-1.2而不是jstl-1.2.1对我也有用,我也不知道为什么。
avojak

1

如果你使用Spring的引导,可以考虑删除server.tomcat.additional-tld-skip-patterns=*.jarApplication.properties,如果有任何


0

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

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

对我来说,解决方案是不要在测试范围内运行,因此我不会gwt-test-utils在运行时拿起软件包。gwt-dev以其他方式从类路径中删除软件包也将解决此问题。


0

在Eclipse中有类似的问题,已解决:

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

在我编辑pom.xml之前,有些东西被淘汰了

我有所有需要的jar文件,taglib uri和web.xml都可以


0

2020年的答案

这个问题仍然很受欢迎,但是所有答案都已经过时了。所有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>

是的,版本和groupIds不匹配,但这是项目当前状态的一个怪癖


是的,但这不能解决我的问题,但是关闭,使用tomcat10,您需要两个库* taglibs-standard-impl-1.2.5-migrated-0.0.1.jar * taglibs-standard-spec-1.2.5-migrated- 0.0.1.jar可以从tomcat10示例Web应用程序中检索此lib,也可以不扫描taglibs-standard *,因为其中存在tld文件,可以在webapp META-CONF lib中的context.xml中禁用它
Jasonw


-1

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

在此处输入图片说明


-2

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

  1. 项目属性
  2. 项目方面
  3. JSTL复选框
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.