จะติดตั้ง JSTL ได้อย่างไร? uri สัมบูรณ์: http://java.sun.com/jstl/core ไม่สามารถแก้ไขได้


138

ฉันไม่รู้ว่าฉันทำอะไรไม่ถูกต้อง แต่ฉันไม่สามารถรวม 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
ฉันต้องเพิ่ม taglibs depdendency ข้าง jstl และก็ใช้งานได้
Christian Vielma

คำตอบ:


200

org.apache.jasper.JasperException: uri สัมบูรณ์: http://java.sun.com/jstl/coreไม่สามารถแก้ไขได้ทั้งใน web.xml หรือไฟล์ jar ที่ปรับใช้กับแอปพลิเคชันนี้

URI นั้นใช้สำหรับ JSTL 1.0 แต่จริงๆแล้วคุณกำลังใช้ JSTL 1.2 ซึ่งใช้ URI กับ/jspพา ธเพิ่มเติม(เนื่องจาก JSTL ซึ่งเป็นผู้คิดค้นนิพจน์ EL นั้นได้รวมเวอร์ชัน 1.1 เป็นส่วนหนึ่งของ JSP เพื่อแชร์ / นำตรรกะ EL มาใช้ใหม่ JSP ธรรมดาด้วย)

ดังนั้นแก้ไข taglib URI ตามเอกสาร JSTL :

<%@ 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 อยู่ด้วยกัน นี่เป็นสิ่งที่ไม่ถูกต้อง โดยพื้นฐานแล้วคุณกำลังผสม JSTL 1.2 API + im จาก Oracle กับ JSTL 1.1 im จาก Apache คุณจำเป็นต้องลบ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โฟลเดอร์ของโครงการแอพลิเคชันเว็บ (ไม่อย่างไม่วาง standard.jar หรือไฟล์ TLD ในขณะใด ๆ หลวมในที่นั่น!) ลบออกหากจำเป็น

ในกรณีที่คุณใช้เซิร์ฟเวอร์ Java EE ปกติเช่น WildFly, Payara ฯลฯ แทนที่จะเป็น servletcontainer แบบแบร์โบนเช่น Tomcat, Jetty เป็นต้นคุณไม่จำเป็นต้องติดตั้ง JSTL อย่างชัดเจนเลย เซิร์ฟเวอร์ Java EE ปกติจัดเตรียม JSTL ไว้ให้แล้ว กล่าวอีกนัยหนึ่งคุณไม่จำเป็นต้องเพิ่ม JSTL pom.xmlหรือวางไฟล์ JAR / TLD ใด ๆ ใน webapp เพียงแค่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 หรือเก่ากว่า มิฉะนั้นนิพจน์ EL ภายในแท็ก JSTL จะล้มเหลวในการทำงาน เลือกเวอร์ชันสูงสุดที่ตรงกับคอนเทนเนอร์เป้าหมายของคุณและตรวจสอบให้แน่ใจว่าคุณไม่มี<!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

4
แล้ว classpath ของคุณก็ยุ่งเหยิง ล้างข้อมูล ฉันไม่รู้ว่า maven กำลังทำอะไรและมันฉลาดหรือเปล่าแต่สำหรับ JSTL 1.2 คุณไม่จำเป็นต้องใช้standardtaglib อ่านหน้าข้อมูลแท็กเพื่อดูรายละเอียดเพิ่มเติม
BalusC

4
ฉันชอบหน้า JSTL wiki ที่คุณนำมารวมกัน อย่างไรก็ตามเนื่องจากคำถามนี้เป็นคำถามที่ได้รับความนิยมสูงสุดจาก Google สำหรับข้อความแสดงข้อผิดพลาดนี้ฉันจึงมีอิสระในการแก้ไขและโปรดทราบว่า URI "non-jsp" มาจาก JSTL 1.0
kdgregory

2
@kdgregory: ขอบคุณ :)
BalusC

1
หากคุณใช้ Gradle ให้เพิ่มการอ้างอิงนี้:compile('javax.servlet:jstl:1.2')
benscabbia

36

@BalusC ถูกต้อง แต่หากคุณยังคงพบข้อยกเว้นนี้แสดงว่ามีบางอย่างที่คุณทำผิด ข้อมูลที่สำคัญที่สุดที่คุณจะพบอยู่ในหน้าข้อมูลแท็ก SO JSTL

โดยทั่วไปนี่คือสรุปสิ่งที่คุณต้องทำเพื่อจัดการกับข้อยกเว้นนี้

  1. ตรวจสอบเวอร์ชัน servlet ใน web.xml: <web-app version="2.5">

  2. ตรวจสอบว่าเวอร์ชัน JSTL ได้รับการสนับสนุนสำหรับเวอร์ชัน servlet นี้หรือไม่: 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 (จะทำงานได้ทั่วโลกสำหรับแอปพลิเคชันทั้งหมด)

สิ่งสุดท้ายคือ taglib ในไฟล์ jsp ของคุณ สำหรับ JSTL 1.2 สิ่งที่ถูกต้องคือ:

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

3
ฉันสังเกตว่าคำถามนี้ค่อนข้างเป็นที่นิยม (ผู้ชมจำนวนมาก) นี่คือเหตุผลที่ฉันตัดสินใจเขียนบทแนะนำสั้น ๆ เกี่ยวกับวิธีจัดการกับปัญหานี้
lukastymo

17

ฉันพบสาเหตุอื่นสำหรับข้อผิดพลาดประเภทนี้: ในกรณีของฉันมีคนตั้งconf/catalina.propertiesค่าtomcat.util.scan.StandardJarScanFilter.jarsToSkipคุณสมบัติการตั้งค่า*เพื่อหลีกเลี่ยงข้อความเตือนบันทึกจึงข้ามการสแกนที่จำเป็นโดย Tomcat การเปลี่ยนกลับเป็นค่าเริ่มต้นของ Tomcat และเพิ่มรายการไหที่เหมาะสมเพื่อข้ามไป (ไม่รวม jstl-1.2 หรือ spring-webmvc) ช่วยแก้ปัญหาได้


ใช่!. ฉันด้วย. ใครบางคน (= ตัวเอง) ในบางจุดที่ใส่tomcat.util.scan.StandardJarScanFilter.jarsToSkip=* ลงไปในcatalina.propertiesแฟ้มใน (เข้าใจผิด?) พยายามที่จะเพิ่มความเร็วใน Tomcat เริ่มต้นขึ้นเวลา อ๊าก!
peterh

ฉันใช้สคริปต์ต่อไปนี้เพื่อสร้างรายการ jarsToSkip ซึ่งหลีกเลี่ยง TLDs และ web-fragment jars: pastebin.com/3Bfm1u6K
Moreaki

1
หากคุณไม่ต้องการเปลี่ยนjarsToSkipการตั้งค่าของคุณด้านล่างจะมีการjarsToScanตั้งค่าที่ลบล้างสิ่งjarsToSkipต่างๆ เราจบลงด้วยการเพิ่มtaglibs*.jarของเราjarsToScanเป็น taglibs ของเราและ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และแก้ไขแล้ว
Gary S.

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 ของคุณ ในกรณีของฉันทั้งสองแก้ปัญหาได้


ได้โปรดดูคำถามที่นี่ [ stackoverflow.com/questions/44039706/…
Kasun Siyambalapitiya

12
  1. ดาวน์โหลดjstl-1.2.jar
  2. เพิ่มคำสั่งนี้ในเพจของคุณ: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  3. วางไฟล์ JAR ในโฟลเดอร์ WEB-INF / lib ของคุณ สิ่งนี้ควรใช้งานได้ (มันได้ผลสำหรับฉัน)


10

เพิ่มjstl-1.2.jarลงในtomcat/libโฟลเดอร์

ด้วยสิ่งนี้ข้อผิดพลาดในการพึ่งพาของคุณจะได้รับการแก้ไขอีกครั้ง


3

ฉันได้กล่าวว่าการพึ่งพา Maven ใน pom.xml นั้นไม่ถูกต้อง มันควรจะเป็น

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

น่าสนใจเมื่อฉันค้นหา jstl ใน maven ฉันพบว่าตัวเองอยู่ใน: mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl/1.2คุณพบการพึ่งพานี้ได้อย่างไร?
Koray Tugay

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

สิ่งที่แก้ไขปัญหานี้สำหรับฉันคือการลบแท็กขอบเขตออกจากไฟล์ xml ของฉันใน pom สำหรับการพึ่งพา jstl 1.2 ของฉัน ไม่แน่ใจอีกครั้งว่าเหตุใดจึงแก้ไขได้ แต่ในกรณีที่มีคนทำสปริงด้วย JPA และ Hibernate แบบฝึกหัดเกี่ยวกับการมองเห็นพหูพจน์และมีการตั้งค่า pom ด้วยวิธีนี้ให้ลองลบแท็กขอบเขตออกและดูว่าสามารถแก้ไขได้หรือไม่ อย่างที่ฉันบอกว่ามันได้ผลสำหรับฉัน


2

ฉันปิดการใช้งานเครื่องมือ MAVEN และ 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
  • สปริงคอร์ 4.0.3.RELEASE.jar
  • สปริงนิพจน์ 4.0.3.RELEASE.jar
  • สปริงเว็บ 4.0.3.RELEASE.jar
  • สปริง webmvc-4.0.3.RELEASE.jar
  • jstl-1.2.jar

ที่เลวร้ายที่สุดของทั้งหมดคือและjstl-api-1.2.jar javax-servlet.jsp.jst-api-1.2.1.jarพวกเขาไม่ได้ทำงาน

jstl-1.2.jar ทำงานได้ดี


1
+1 หลังจากเอาหัวโขกกำแพงมาหลายชั่วโมงแล้วใช้jstl-1.2แทนการjstl-1.2.1ทำงานของฉันด้วยและฉันก็ไม่รู้ว่าทำไม
avjak

1

ถ้าคุณใช้บูตฤดูใบไม้ผลิพิจารณาเพื่อลบserver.tomcat.additional-tld-skip-patterns=*.jarจากApplication.propertiesหากมีใด ๆ


0

คำตอบทั้งหมดในคำถามนี้ช่วยฉันได้ แต่ฉันคิดว่าฉันจะเพิ่มข้อมูลเพิ่มเติมสำหรับลูกหลาน

ปรากฎว่าฉันมีการพึ่งพาการทดสอบgwt-test-utilsซึ่งนำมาในgwt-devแพ็คเกจ น่าเสียดายที่gwt-devมี Jetty, JSP, JSTL และอื่น ๆ ซึ่งอยู่ก่อนหน้าแพ็คเกจที่เหมาะสมบน classpath ดังนั้นแม้ว่าฉันจะมีการอ้างอิงที่เหมาะสมกับ JSTL 1.2 แต่ก็จะโหลดเวอร์ชัน 1.0 ภายในเป็นgwt-devไฟล์. บ่น.

วิธีแก้ปัญหาสำหรับฉันคือห้ามเรียกใช้ด้วยขอบเขตการทดสอบดังนั้นฉันจึงไม่รับgwt-test-utilsแพ็คเกจขณะรันไทม์ การลบgwt-devแพ็คเกจออกจาก classpath ในลักษณะอื่น ๆ จะช่วยแก้ปัญหาได้เช่นกัน


0

เพิ่งมีปัญหาที่คล้ายกันใน Eclipse ได้รับการแก้ไขด้วย:

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

มีบางอย่างที่เตะออกมาก่อนขณะที่ฉันกำลังแก้ไข pom.xml

ฉันมีไฟล์ jar ที่จำเป็นทั้งหมด taglib uri และ web.xml ก็โอเค


0

คำตอบสำหรับปี 2020

คำถามยังคงเป็นที่นิยมอย่างมาก แต่คำตอบทั้งหมดล้าสมัยอย่างมาก ส่วนประกอบ Java EE ทั้งหมดถูกแยกออกเป็นโครงการต่างๆจาการ์ตาและ 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 คุณต้องมีสอง libs * taglibs-standard-im-1.2.5-migrated-0.0.1.jar * taglibs-standard-spec-1.2.5-migrated- 0.0.1.jar lib นี้สามารถเรียกดูได้จากเว็บแอปตัวอย่าง tomcat10 และอย่าสแกน taglibs-standard * เนื่องจากมีไฟล์ tld อยู่ในนั้นจึงสามารถปิดใช้งานใน context.xml ใน webapp META-CONF lib
Jasonw


-1

ฉันมีปัญหาเดียวกันฉันกำลังใช้ eclipse ในกรณีที่ผู้อื่นประสบปัญหาเดียวกัน:
ใน eclipse ดับเบิลคลิกที่เซิร์ฟเวอร์ tomcat
หยุดเซิร์ฟเวอร์โดยไม่
เลือก "โมดูลเซิร์ฟเวอร์ที่ไม่มีการเผยแพร่" เพื่อ
เริ่มเซิร์ฟเวอร์

ป้อนคำอธิบายภาพที่นี่


-2

แก้ไขปัญหาที่คล้ายกันใน IBM RAD 7.5 โดยเลือก:

  1. คุณสมบัติโครงการ
  2. แง่มุมโครงการ
  3. กล่องกาเครื่องหมาย JSTL
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.