Bagaimana cara menginstal JSTL? Uri absolut: http://java.sun.com/jstl/core tidak dapat diselesaikan

134

Saya tidak tahu apa yang saya lakukan salah, tetapi saya tidak bisa memasukkan JSTL. Saya memiliki jstl-1.2.jar, tapi sayangnya saya mendapatkan pengecualian:

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)

Saya sudah:

  • 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>
lukastymo
sumber
4
Saya harus menambahkan ketergantungan taglibs juga di samping jstl dan hanya bekerja.
Christian Vielma

Jawaban:

193

org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jstl/core tidak dapat diselesaikan di web.xml atau file jar yang digunakan dengan aplikasi ini

URI itu untuk JSTL 1.0, tetapi Anda sebenarnya menggunakan JSTL 1.2 yang menggunakan URI dengan /jspjalur tambahan (karena JSTL, yang menemukan ekspresi EL, sejak versi 1.1 terintegrasi sebagai bagian dari JSP untuk berbagi / menggunakan kembali logika EL di JSP polos juga).

Jadi, perbaiki URI taglib sesuai dengan dokumentasi JSTL :

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

Selanjutnya Anda perlu memastikan bahwa Anda tidak membuang beberapa file JSTL JAR yang berbeda berversi bersama ke dalam classpath runtime. Ini adalah kesalahan yang cukup umum di antara pengguna Tomcat. Masalah dengan Tomcat adalah bahwa ia tidak menawarkan JSTL di luar kotak dan dengan demikian Anda harus menginstalnya secara manual. Ini tidak perlu di server Java EE normal. Lihat juga Apa sebenarnya Java EE?

Dalam kasus spesifik Anda, pom.xml Anda pada dasarnya memberi tahu Anda bahwa Anda memiliki jstl-1.2.jar dan standard-1.1.2.jar bersama-sama. Ini salah. Anda pada dasarnya mencampur JSTL 1.2 API + impl dari Oracle dengan JSTL 1.1 impl dari Apache. Anda harus menghapus semua standard-xxx.jar. Hanya saja yang jstl-1.2.jarcukup.

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

Pengguna non-Maven dapat mencapai hal yang sama dengan menjatuhkan file fisik jstl-1.2.jar dalam /WEB-INF/libfolder proyek aplikasi web (jangan sekali-kali tidak menjatuhkan file standard.jar atau file .tld yang longgar di sana!). Hapus mereka jika perlu.

Jika Anda benar-benar menggunakan server Java EE normal seperti WildFly, Payara, dll, bukannya servebcontainer barebones seperti Tomcat, Jetty, dll, maka Anda tidak perlu menginstal JSTL sama sekali secara eksplisit. Server Java EE yang normal sudah menyediakan JSTL di luar kotak. Dengan kata lain, Anda tidak perlu menambahkan JSTL ke pom.xmlatau untuk menjatuhkan file JAR / TLD apa pun di webapp. Semata-mata providedkoordinat Java EE yang mencukupi sudah cukup:

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

Selanjutnya Anda juga harus memastikan bahwa Anda web.xmldinyatakan sesuai setidaknya Servlet 2.4 dan dengan demikian tidak servlet 2.3 atau lebih tua. Kalau tidak, ekspresi EL di dalam tag JSTL pada gilirannya akan gagal berfungsi. Pilih versi tertinggi yang cocok dengan wadah target Anda dan pastikan Anda tidak memiliki <!DOCTYPE>tempat di mana pun web.xml. Inilah contoh kompatibel 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>

Lihat juga:

BalusC
sumber
Saya telah berubah menjadi / jsp dan: org.apache.jasper.JasperException: uri absolut: java.sun.com/jsp/jstl/core tidak dapat diselesaikan di web.xml ....
lukastymo
4
Maka classpath Anda berantakan. Bersihkan itu. Saya tidak tahu apa yang dilakukan pakar dan apakah itu cerdas, tetapi untuk JSTL 1.2 Anda tidak perlu standardtaglib. Baca halaman info tag untuk detail lebih lanjut.
BalusC
4
Saya sangat suka halaman wiki JSTL yang Anda buat bersama. Namun, karena pertanyaan ini adalah hit teratas dari Google untuk pesan kesalahan tertentu, saya mengambil kebebasan untuk mengeditnya dan perhatikan bahwa URI "non-jsp" berasal dari JSTL 1.0.
kdgregory
2
@kdgregory: Terima kasih :)
BalusC
1
jika Anda menggunakan Gradle, tambahkan ketergantungan ini:compile('javax.servlet:jstl:1.2')
benscabbia
36

@ BalusC sepenuhnya benar, tetapi Jika Anda masih menemukan pengecualian ini, itu berarti bahwa Anda telah melakukan kesalahan. Informasi paling penting yang akan Anda temukan adalah pada halaman Info Tag SO JSTL .

Pada dasarnya ini adalah ringkasan dari apa yang perlu Anda lakukan untuk menghadapi pengecualian ini.

  1. Periksa versi servlet di web.xml: <web-app version="2.5">

  2. Periksa apakah versi JSTL didukung untuk versi servlet ini: Servlet versi 2.5 menggunakan JSTL 1.2 atau Servlet versi 2.4 menggunakan JSTL 1.1

  3. Wadah servlet Anda harus memiliki perpustakaan yang sesuai, atau Anda harus memasukkannya secara manual dalam aplikasi Anda. Sebagai contoh: JSTL 1.2 membutuhkan jstl-1.2.jar

Apa yang harus dilakukan dengan Tomcat 5 atau 6:

Anda perlu memasukkan toples yang sesuai ke dalam direktori WEB-INF / lib Anda (ini hanya akan berfungsi untuk aplikasi Anda) atau ke tomcat / lib (akan berfungsi secara global untuk semua aplikasi).

Hal terakhir adalah taglib di file jsp Anda. Untuk JSTL 1.2 yang benar adalah ini:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
lukastymo
sumber
3
Saya perhatikan bahwa pertanyaan ini cukup populer (banyak pemirsa). Jadi ini sebabnya saya memutuskan untuk menulis tutorial singkat bagaimana menangani masalah ini
lukastymo
17

Saya menemukan alasan lain untuk jenis kesalahan ini: dalam kasus saya, seseorang mengatur properti conf/catalina.propertiespengaturan untuk menghindari pesan peringatan log, sehingga melewatkan pemindaian yang diperlukan oleh Tomcat. Mengubah ini kembali ke default Tomcat dan menambahkan daftar toples yang tepat untuk dilewati (tidak termasuk jstl-1.2 atau spring-webmvc) menyelesaikan masalah.tomcat.util.scan.StandardJarScanFilter.jarsToSkip*

resnbl
sumber
Iya!. Saya juga. Seseorang (= saya sendiri) pada suatu saat dimasukkan tomcat.util.scan.StandardJarScanFilter.jarsToSkip=* ke dalam catalina.propertiesfile dalam upaya (disalahpahami?) Untuk mempercepat waktu mulai Tomcat. Arghh!
peterh
Saya menggunakan skrip berikut untuk membuat daftar jarsToSkip yang menghindari TLD dan guci web-fragmen: pastebin.com/3Bfm1u6K
Moreaki
1
Jika Anda tidak ingin mengubah jarsToSkippengaturan Anda , di bawahnya ada jarsToScanpengaturan yang menimpa apa pun di jarsToSkip. Kami akhirnya menambahkan taglibs*.jarke kami jarsToScansebagai taglibs kami taglibs-standard-impl-1.2.5.jardan taglibs-standard-spec-1.2.5.jar.
jabe
1
Inilah jawaban yang berhasil untuk saya. Dalam conf/catalina.properties, saya berubah tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jarmenjadi tomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jardan memperbaikinya.
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" %>

periksa juga stoples ketergantungan yang telah Anda tambahkan javax.servlet.jardan javax.servlet.jsp.jstl-1.2.1.jaratau tidak di folder WEB-INF / lib Anda. Dalam kasus saya, keduanya memecahkan masalah.

streethawk
sumber
dapatkah Anda melihat pertanyaan di sini [ stackoverflow.com/questions/44039706/…
Kasun Siyambalapitiya
10

Tambahkan jstl-1.2.jarke dalam tomcat/libfolder.

Dengan ini, kesalahan ketergantungan Anda akan diperbaiki lagi.

Hadi Rasouli
sumber
10
  1. Unduh jstl-1.2.jar
  2. Tambahkan arahan ini ke halaman Anda: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  3. Rekatkan file JAR di folder WEB-INF / lib Anda. Ini seharusnya bekerja. (Ini berhasil untuk saya.)

Prashant Ghimire
sumber
3

Saya telah menyebutkan bahwa ketergantungan Maven di pom.xml salah. Harus

    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
LoBo
sumber
Menarik, ketika saya mencari jstl di maven saya menemukan diri saya di: mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl/1.2 Bagaimana Anda menemukan ketergantungan ini?
Koray Tugay
3

Saya hanya ingin menambahkan perbaikan yang saya temukan untuk masalah ini. Saya tidak yakin mengapa ini berhasil. Saya memiliki versi jstl yang benar (1.2) dan juga versi servlet-api yang benar (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>

Saya juga memiliki alamat yang benar di halaman saya seperti yang disarankan di utas ini, yaitu

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

Apa yang memperbaiki masalah ini bagi saya adalah menghapus tag lingkup dari file xml saya di pom untuk ketergantungan jstl 1.2 saya. Sekali lagi tidak yakin mengapa itu memperbaikinya tetapi kalau-kalau ada orang yang melakukan pegas dengan JPA dan tutorial Hibernate pada pluralsight dan memiliki pengaturan pom mereka dengan cara ini, coba hapus tag lingkup dan lihat apakah itu memperbaikinya. Seperti yang saya katakan itu bekerja untuk saya.

gnattyp
sumber
2

Saya telah menonaktifkan sepenuhnya alat MAVEN dan Spring. Dan saya harus menambahkan tabung berikut untuk membuat lingkungan saya berfungsi dengan baik.

  • spring-aop-4.0.3.RELEASE.jar
  • spring-beans-4.0.3.RELEASE.jar (sulit untuk menemukan perbaikan ini, org.springframework lain <3.versi> hanya tidak bekerja.
  • 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

Yang terburuk dari semuanya adalah jstl-api-1.2.jardan javax-servlet.jsp.jst-api-1.2.1.jar. Mereka tidak bekerja.

jstl-1.2.jar bekerja dengan baik.

Siddharth
sumber
1
+1 Setelah memukul kepala saya ke dinding selama berjam-jam, menggunakan jstl-1.2bukannya jstl-1.2.1bekerja untuk saya juga, dan saya tidak tahu mengapa.
avojak
1

Jika Anda menggunakan boot Spring, pertimbangkan untuk menghapus server.tomcat.additional-tld-skip-patterns=*.jardari Application.propertiesjika ada

Askar
sumber
0

Semua jawaban dalam pertanyaan ini membantu saya, tetapi saya pikir saya akan menambahkan beberapa informasi tambahan untuk keturunan.

Ternyata saya memiliki tes ketergantungan gwt-test-utilsyang membawa gwt-devpaket. Sayangnya gwt-devberisi salinan lengkap Jetty, JSP, JSTL, dll. Yang berada di depan paket yang sesuai di classpath. Jadi meskipun saya memiliki dependensi yang tepat pada JSTL 1.2 itu akan memuat versi 1.0 ke internal gwt-dev. Ngomel.

Solusi bagi saya adalah tidak menjalankan dengan cakupan uji jadi saya tidak mengambil gwt-test-utilspaket saat runtime. Menghapus gwt-devpaket dari classpath dengan cara lain juga akan memperbaiki masalah.

Abu-abu
sumber
0

Baru saja mengalami masalah serupa di Eclipse diperbaiki dengan:

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

sesuatu menendang keluar sebelumnya, ketika saya sedang mengedit pom.xml saya

Saya membutuhkan semua file jar, taglib uri dan web.xml ok

w3Charlie
sumber
0

Jawaban untuk tahun 2020

Pertanyaannya masih sangat populer, tetapi semua jawaban sudah usang. Semua komponen Java EE terpecah menjadi berbagai proyek di Jakarta dan JSTL tidak berbeda. Jadi di sini adalah dependensi Maven yang benar pada hari ini:

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

Ya, versi dan groupIds tidak cocok, tapi itu kekhasan kondisi proyek saat ini .

JohnEye
sumber
ya, tapi ini tidak menyelesaikan masalah saya tetapi tutup, dengan tomcat10, Anda memerlukan dua libs * taglibs-standard-impl-1.2.5-migrated-0.0.1.jar * taglibs-standard-spec-1.2.5-migrated- 0.0.1.jar lib ini dapat diambil dari webapps sampel Tomcat10 juga jangan memindai taglibs-standar * karena file tld ada di sana, ini dapat dinonaktifkan dalam konteks.xml di webapp lib META-CONF
Jasonw
-1

Ini berhasil bagi saya

    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
Ajay Kumar Sinha
sumber
-1

Saya memiliki masalah yang sama, saya menggunakan eclipse, kalau-kalau ada orang lain yang mengalami masalah yang sama:
Dalam eclipse klik dua kali server kucing jantan,
hentikan server
membuka centang "modul server tanpa penerbitan"
mulai server.

masukkan deskripsi gambar di sini

JavaSheriff
sumber
-2

Mengatasi masalah serupa di IBM RAD 7.5 dengan memilih:

  1. Properti proyek
  2. Aspek Proyek
  3. Kotak centang JSTL
c. hantz
sumber