JSTL nasıl kurulur? Mutlak uri: http://java.sun.com/jstl/core çözülemiyor


135

Neyi yanlış yaptığımı bilmiyorum ama JSTL'yi dahil edemem. Jstl-1.2.jar'ım var, ancak maalesef istisnayla karşılaşıyorum:

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)

Sahibim:

  • 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 bağımlılığını jstl'nin yanına da eklemek zorunda kaldım ve sadece çalıştım.
Christian Vielma

Yanıtlar:


193

org.apache.jasper.JasperException: Mutlak uri: http://java.sun.com/jstl/core ne web.xml'de ne de bu uygulama ile dağıtılan jar dosyalarında çözülemez

Bu URI JSTL 1.0 içindir, ancak aslında ek bir /jspyolla URI'ler kullanan JSTL 1.2'yi kullanıyorsunuz (çünkü EL ifadelerini icat eden JSTL, EL mantığını paylaşmak / yeniden kullanmak için 1.1 sürümünden beri JSP'nin bir parçası olarak entegre edildi. düz JSP de).

Bu nedenle, taglib URI'sini JSTL belgelerine göre uygun şekilde düzeltin :

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

Ayrıca , birden çok farklı sürümü belirlenmiş JSTL JAR dosyasını birlikte çalışma zamanı sınıf yoluna atmadığınızdan kesinlikle emin olmanız gerekir . Bu, Tomcat kullanıcıları arasında oldukça yaygın bir hatadır. Tomcat ile ilgili sorun, JSTL'yi kutunun dışında sunmaması ve bu nedenle manuel olarak yüklemeniz gerektiğidir. Normal Java EE sunucularında bu gerekli değildir. Ayrıca bkz. Java EE tam olarak nedir?

Özel durumunuzda, pom.xml dosyanız temelde jstl-1.2.jar ve standard-1.1.2.jar'ın birlikte olduğunu söyler. Bu yanlış. Temel olarak Oracle'dan JSTL 1.2 API + impl'yi Apache'nin JSTL 1.1 impl'si ile karıştırıyorsunuz. Herhangi birini kaldırmanız gerekiyor standard-xxx.jar. Sadece tekjstl-1.2.jar yeterlidir.

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

Maven olmayan kullanıcılar, fiziksel jstl-1.2.jar dosyasını /WEB-INF/libweb uygulaması projesinin klasörüne bırakarak aynı şeyi başarabilirler ( kesinlikle standard.jar dosyasını veya herhangi bir gevşek .tld dosyasını buraya düşürmeyin!). Gerekirse çıkarın.

Tomcat, Jetty gibi bir barebone servletcontainer yerine WildFly, Payara vb. Gibi normal bir Java EE sunucusu kullanıyorsanız, JSTL'yi açıkça yüklemeniz gerekmez. Normal Java EE sunucuları zaten kutudan JSTL sağlar. Diğer bir deyişle, web uygulamasına JSTL eklemenize pom.xmlveya JAR / TLD dosyalarını bırakmanıza gerek yoktur . Yalnızca providedkapsamlı Java EE koordinatı yeterlidir:

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

Ayrıca web.xml, en azından Servlet 2.4'e uygun olduğunun ve dolayısıyla Servlet 2.3 veya daha eski olmadığının beyan edildiğinden emin olmalısınız . Aksi takdirde, JSTL etiketleri içindeki EL ifadeleri de sonuçta çalışmayacaktır. Hedef kabı eşleşen en yüksek sürümünü seçin ve bir yok emin olmak <!DOCTYPE>Gözlerinde farklı hiçbir yerinde web.xml. İşte Servlet 4.0 (Tomcat 9) uyumlu bir örnek:

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

Ayrıca bakınız:


Org.apache.jasper.JasperException: Ben / jsp ve değiştirdik mutlak URI: java.sun.com/jsp/jstl/core .... Ya web.xml''deki çözülemeyen
lukastymo

4
O zaman sınıf yolunuz bir karmaşa. Temizle şunu. Maven'in ne yaptığını ve akıllı olup olmadığını bilmiyorum, ancak JSTL 1.2 için taglib'e ihtiyacınız yokstandard . Daha fazla ayrıntı için etiket bilgileri sayfasını okuyun.
BalusC

4
Bir araya getirdiğiniz JSTL wiki sayfasını gerçekten beğendim. Ancak, bu soru belirli bir hata mesajı için Google'ın en çok vurduğu soru olduğundan, onu düzenleme özgürlüğünü kullanıyorum ve "jsp olmayan" URI'nin JSTL 1.0'dan geldiğine dikkat ediyorum.
kdgregory

2
@kdgregory: Teşekkür ederim :)
BalusC

1
Gradle kullanıyorsanız, bu bağımlılığı ekleyin:compile('javax.servlet:jstl:1.2')
benscabbia

36

@BalusC tamamen haklı, ancak yine de bu istisnayla karşılaşırsanız, bu bir şeyi yanlış yaptığınız anlamına gelir. Bulacağınız en önemli bilgiler SO JSTL Etiket Bilgileri sayfasındadır.

Temel olarak bu, bu istisnayla başa çıkmak için yapmanız gerekenlerin bir özetidir.

  1. Web.xml'deki sunucu uygulaması sürümünü kontrol edin: <web-app version="2.5">

  2. Bu sunucu uygulaması sürümü için JSTL sürümünün desteklenip desteklenmediğini kontrol edin: Servlet sürüm 2.5, JSTL 1.2 kullanır veya Servlet sürüm 2.4, JSTL 1.1 kullanır

  3. Sunucu uygulaması kapsayıcınız uygun kitaplığa sahip olmalı veya bunu uygulamanıza el ile eklemelisiniz. Örneğin: JSTL 1.2, jstl-1.2.jar gerektirir

Tomcat 5 veya 6 ile ne yapılmalı :

WEB-INF / lib dizininize (yalnızca uygulamanız için çalışacaktır) veya tomcat / lib'e (tüm uygulamalar için global olarak çalışacaktır) uygun jar (ler) eklemeniz gerekir.

Son şey, jsp dosyalarınızdaki bir taglib'dir. JSTL 1.2 için doğru olan şudur:

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

3
Bu sorunun oldukça popüler olduğunu fark ettim (birçok izleyici). İşte bu yüzden bu problemle nasıl başa çıkılacağına dair kısa bir eğitim yazmaya karar verdim
lukastymo

17

Bu tür bir hatanın başka bir nedenini buldum: Benim durumumda, birisi conf/catalina.propertiesayar tomcat.util.scan.StandardJarScanFilter.jarsToSkipözelliğini *günlük uyarı mesajlarından kaçınmak için ayarladı ve böylece Tomcat tarafından gerekli taramayı atladı. Bunu Tomcat varsayılanına geri döndürmek ve atlanacak uygun bir kavanoz listesi eklemek (jstl-1.2 veya spring-webmvc hariç) sorunu çözdü.


Evet!. Ben de. Bazı nokta koymak bakan birileri (= ben) tomcat.util.scan.StandardJarScanFilter.jarsToSkip=* içine catalina.propertiesbir dosya (yanlış anlaşılmış?) Tomcat'e kadar hız girişiminde başlangıç süresi. Arghh!
peterh

TLD'lerden ve web parçası kavanozlarından kaçınan bir jarsToSkip listesi oluşturmak için aşağıdaki komut dosyasını kullanıyorum: pastebin.com/3Bfm1u6K
Moreaki

1
jarsToSkipAyarınızı değiştirmek istemiyorsanız , altında jarsToScaniçindeki herhangi bir şeyi geçersiz kılan bir ayar vardır jarsToSkip. Biz ekleyerek sona erdi taglibs*.jarkızımız için jarsToScanbizim taglibs olduğu gibi taglibs-standard-impl-1.2.5.jarve taglibs-standard-spec-1.2.5.jar.
jabe

1
Benim için işe yarayan cevap bu. Olarak conf/catalina.properties, ben değiştim tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jaretmek tomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jarve o düzelttim.
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" %>

Ayrıca lütfen WEB-INF / lib klasörünüze eklediğiniz javax.servlet.jarve eklemediğiniz bağımlılık kavanozlarını kontrol edin javax.servlet.jsp.jstl-1.2.1.jar. Benim durumumda bu ikisi sorunu çözdü.


soruya buradan bir göz atabilir misiniz? [ stackoverflow.com/questions/44039706/…
Kasun Siyambalapitiya

10

Ekle jstl-1.2.jariçine tomcat/libklasörde.

Bununla bağımlılık hatanız tekrar düzeltilecektir.


10
  1. Jstl-1.2.jar dosyasını indirin
  2. Bu yönergeyi sayfanıza ekleyin: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  3. JAR dosyasını WEB-INF / lib klasörünüze yapıştırın. Bu çalışmalı. (Benim için çalıştı.)



3

Sadece bu sorun için bulduğum düzeltmeyi eklemek istedim. Bunun neden işe yaradığından emin değilim. Jstl (1.2) 'nin doğru sürümüne ve ayrıca servlet-api'nin (2.5) doğru sürümüne sahiptim

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

Bu ileti dizisinde önerildiği gibi sayfamda da doğru adres vardı.

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

Benim için bu sorunu çözen şey, kapsam etiketini jstl 1.2 bağımlılığım için pom'daki xml dosyamdan kaldırmaktı. Yine bunun neden düzeltildiğinden emin değilim, ancak birisinin pluralsight üzerinde JPA ve Hibernate eğitimiyle yayı yapması ve pom kurulumunu bu şekilde yapması durumunda, kapsam etiketini kaldırmayı deneyin ve bunun düzeltilip düzeltilmediğine bakın. Dediğim gibi benim için çalıştı.


2

MAVEN ve Spring araçlarını tamamen devre dışı bıraktım. Ve ortamımın doğru çalışması için aşağıdaki kavanozları eklemek zorunda kaldım.

  • Yay AOP-4.0.3.RELEASE.jar
  • spring -bean-4.0.3.RELEASE.jar (bu düzeltmeyi bulmak zor, diğer org.springframework <3.versions> çalışmadı.
  • Yay bağlama 4.0.3.RELEASE.jar
  • Yay çekirdekli 4.0.3.RELEASE.jar
  • Yay ifadesi-4.0.3.RELEASE.jar
  • Yay web 4.0.3.RELEASE.jar
  • Yay webmvc-4.0.3.RELEASE.jar
  • JSTL-1.2.jar

Hepsinden kötüsü jstl-api-1.2.jarve idi javax-servlet.jsp.jst-api-1.2.1.jar. Onlar sadece vermedi çalışır.

jstl-1.2.jar iyi çalıştı.


1
+1 Saatlerce kafamı duvara vurduktan sonra kullanmak jstl-1.2yerine jstl-1.2.1benim için de çalıştı ve nedenini bilmiyorum.
avojak

1

Bahar çizme kullanıyorsanız, kaldırmak dikkate server.tomcat.additional-tld-skip-patterns=*.jarden Application.propertiesherhangi varsa


0

Bu sorunun tüm cevapları bana yardımcı oldu, ancak gelecek nesil için bazı ek bilgiler eklemeyi düşündüm.

Paketi gwt-test-utilsgetiren bir test bağımlılığım olduğu ortaya çıktı gwt-dev. Maalesef gwt-dev, sınıf yolunda uygun paketlerin önünde olan Jetty, JSP, JSTL, vb .'nin tam bir kopyasını içerir. Dolayısıyla, JSTL 1.2'ye uygun bağımlılıklarım olmasına rağmen, 1.0 sürümünü dahili olarak yüklüyordu gwt-dev. Homurdanma.

Benim için çözüm, test kapsamıyla çalıştırılmamaktı, bu yüzden gwt-test-utilspaketi çalışma zamanında almam . gwt-devPaketi sınıf yolundan başka bir şekilde kaldırmak da sorunu çözebilirdi.


0

Eclipse'de benzer bir sorunla düzeltildi:

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

pom.xml'imi düzenlerken daha önce bir şey patlak verdi

Gerekli tüm jar dosyalarına sahiptim, taglib uri ve web.xml tamamdı


0

2020 yılı için bir cevap

Soru hala çok popüler, ancak tüm cevaplar cidden güncelliğini yitirmiş durumda. Tüm Java EE bileşenleri çeşitli Jakarta projelerine bölündü ve JSTL farklı değil. İşte bugün itibariyle doğru Maven bağımlılıkları:

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

Evet, sürümler ve groupIds eşleşmiyor, ancak bu , projenin mevcut durumunun bir tuhaflığı .


evet, ama bu benim sorunumu çözmüyor ama yakın, tomcat10 ile iki lib * taglibs-standard-impl-1.2.5-migrated-0.0.1.jar * taglibs-standard-spec-1.2.5-migrated- 0.0.1.jar bu kitaplık tomcat10 örnek web uygulamalarından alınabilir, ayrıca tld dosyaları içeride olduğu için taglibs-standard * taramayın, bu, META-CONF lib web uygulamasında context.xml'de devre dışı
bırakılabilir

-1

Bu benim için çalıştı

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

-1

Ben de aynı sorunu yaşadım, diğerlerinin de aynı sorunu yaşaması durumunda tutulma kullanıyorum:
Tutulmada tomcat sunucusuna çift tıklayın, sunucuyu
durdurun
"yayınlamadan sunucu modülleri" nin işaretini kaldırın, sunucuyu
başlatın.

görüntü açıklamasını buraya girin


-2

Aşağıdakileri seçerek IBM RAD 7.5'teki benzer problem çözüldü:

  1. Proje özellikleri
  2. Proje Yönleri
  3. JSTL onay kutusu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.