Nie wiem, co zrobiłem niepoprawnie, ale nie mogę dołączyć JSTL. Mam jstl-1.2.jar, ale niestety mam wyjątek:
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)
Mam:
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>
Odpowiedzi:
Ten identyfikator URI jest przeznaczony dla JSTL 1.0, ale w rzeczywistości używasz JSTL 1.2, który używa URI z dodatkową
/jsp
ścieżką (ponieważ JSTL, który wynalazł wyrażenia EL, był od wersji 1.1 zintegrowany jako część JSP w celu współużytkowania / ponownego użycia logiki EL w zwykły JSP).Więc odpowiednio popraw identyfikator URI taglib na podstawie dokumentacji JSTL :
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Ponadto należy absolutnie upewnić się , że nie wrzucasz jednocześnie wielu różnych wersji plików JSTL JAR do ścieżki klas środowiska wykonawczego. To dość powszechny błąd wśród użytkowników Tomcat. Problem z Tomcat polega na tym, że nie oferuje on JSTL po wyjęciu z pudełka i dlatego musisz go ręcznie zainstalować. Nie jest to konieczne w przypadku zwykłych serwerów Java EE. Zobacz także Czym dokładnie jest Java EE?
W twoim konkretnym przypadku twój pom.xml w zasadzie mówi ci, że masz razem jstl-1.2.jar i standard-1.1.2.jar. To jest źle. Zasadniczo łączysz JSTL 1.2 API + impl z Oracle z JSTL 1.1 impl z Apache. Musisz usunąć wszystkie
standard-xxx.jar
. Wystarczy tylkojstl-1.2.jar
jest wystarczająca.<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
Użytkownicy spoza Mavena mogą osiągnąć to samo, upuszczając fizyczny plik jstl-1.2.jar w
/WEB-INF/lib
folderze projektu aplikacji internetowej ( absolutnie nie wrzucaj tam standard.jar ani żadnych luźnych plików .tld!). Usuń je, jeśli to konieczne.Jeśli faktycznie używasz normalnego serwera Java EE, takiego jak WildFly, Payara, itp. Zamiast podstawowego serwletu serwletu, takiego jak Tomcat, Jetty itp., Nie musisz w ogóle jawnie instalować JSTL. Normalne serwery Java EE już dostarczają JSTL po wyjęciu z pudełka. Innymi słowy, nie musisz dodawać JSTL
pom.xml
ani upuszczać żadnych plików JAR / TLD w aplikacji internetowej. Jedynieprovided
współrzędna Java EE z określonym zakresem jest wystarczająca:<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version><!-- 8.0, 7.0, etc depending on your server --></version> <scope>provided</scope> </dependency>
Ponadto należy również upewnić się, że
web.xml
deklarowana jest zgodność co najmniej z serwletem 2.4, a więc nie jako serwlet 2.3 lub starszy. W przeciwnym razie wyrażenia EL wewnątrz znaczników JSTL nie zadziałałyby. Wybierz najwyższą wersję pasującą do kontenera docelowego i upewnij się, że nie masz<!DOCTYPE>
nigdzie w swoimweb.xml
. Oto przykład zgodny z serwletem 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>
Zobacz też:
web.xml
przykłady)źródło
standard
taglib. Więcej szczegółów znajdziesz na stronie z informacjami o tagu.compile('javax.servlet:jstl:1.2')
@BalusC ma całkowitą rację, ale jeśli nadal napotykasz ten wyjątek, oznacza to, że zrobiłeś coś źle. Najważniejsze informacje, które znajdziesz, znajdują się na stronie SO JSTL Tag Info .
Zasadniczo jest to podsumowanie tego, co musisz zrobić, aby poradzić sobie z tym wyjątkiem.
Sprawdź wersję serwletu w web.xml:
<web-app version="2.5">
Sprawdź, czy wersja JSTL jest obsługiwana dla tej wersji serwletu: Servlet w wersji 2.5 używa JSTL 1.2 lub Servlet w wersji 2.4 używa JSTL 1.1
Twój kontener serwletów musi mieć odpowiednią bibliotekę lub musisz dołączyć go ręcznie do aplikacji. Na przykład: JSTL 1.2 wymaga jstl-1.2.jar
Co zrobić z Tomcat 5 lub 6:
Musisz dołączyć odpowiednie pliki jar do katalogu WEB-INF / lib (będzie działać tylko dla twojej aplikacji) lub do tomcat / lib (będzie działać globalnie dla wszystkich aplikacji).
Ostatnią rzeczą jest taglib w twoich plikach jsp. Dla JSTL 1.2 poprawne jest to:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
źródło
Znalazłem inny powód tego typu błędu: w moim przypadku ktoś ustawił właściwość
conf/catalina.properties
ustawienia, aby uniknąć komunikatów ostrzegawczych dziennika, pomijając w ten sposób niezbędne skanowanie przez Tomcat. Zmiana tego z powrotem na domyślne Tomcat i dodanie odpowiedniej listy plików JAR do pominięcia (bez jstl-1.2 lub spring-webmvc) rozwiązało problem.tomcat.util.scan.StandardJarScanFilter.jarsToSkip
*
źródło
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*
wcatalina.properties
pliku w (niezrozumianej?) Próbie przyspieszenia uruchamiania Tomcata. Arghh!jarsToSkip
ustawienia, poniżej znajduje sięjarsToScan
ustawienie, które zastępuje wszystko wjarsToSkip
. Skończyło się na dodaniutaglibs*.jar
do naszych,jarsToScan
tak jak były nasze taglibstaglibs-standard-impl-1.2.5.jar
itaglibs-standard-spec-1.2.5.jar
.conf/catalina.properties
zmieniłemtomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar
natomcat.util.scan.StandardJarScanFilter.jarsToScan=jstl*.jar
i to naprawiło.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" %>
sprawdź także pliki jarów zależności, które dodałeś
javax.servlet.jar
ijavax.servlet.jsp.jstl-1.2.1.jar
czy nie znajdują się w folderze WEB-INF / lib. W moim przypadku ta dwójka rozwiązała problem.źródło
Dodaj tę dyrektywę do swojej strony:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Wklej plik JAR do folderu WEB-INF / lib. To powinno działać. (U mnie to zadziałało.)
źródło
Dodaj
jstl-1.2.jar
dotomcat/lib
folderu.Dzięki temu Twój błąd zależności zostanie ponownie naprawiony.
źródło
Wspomniałem, że zależność Mavena w pom.xml jest nieprawidłowa. Powinno być
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
źródło
Chciałem tylko dodać poprawkę, którą znalazłem dla tego problemu. Nie wiem, dlaczego to zadziałało. Miałem poprawną wersję jstl (1.2), a także poprawną wersję 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>
Miałem też poprawny adres na mojej stronie, jak sugerowano w tym wątku, czyli
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Rozwiązaniem tego problemu było usunięcie tagu scope z mojego pliku xml w pom dla mojej zależności od jstl 1.2. Ponownie nie jestem pewien, dlaczego to naprawiło, ale na wypadek, gdyby ktoś robił wiosnę z samouczkiem JPA i Hibernacją na temat liczby mnogiej i ma konfigurację pom w ten sposób, spróbuj usunąć tag zakresu i sprawdź, czy to naprawi. Tak jak powiedziałem, to zadziałało dla mnie.
źródło
Całkowicie wyłączyłem narzędzia MAVEN i Spring. Musiałem dodać następujące słoiki, aby moje środowisko działało poprawnie.
Najgorsze było
jstl-api-1.2.jar
ijavax-servlet.jsp.jst-api-1.2.1.jar
. Po prostu nie działały.jstl-1.2.jar
działało dobrze.źródło
jstl-1.2
zamiastjstl-1.2.1
zadziałało również dla mnie i nie mam pojęcia dlaczego.Jeśli używasz butów Spring, rozważ usunięcie
server.tomcat.additional-tld-skip-patterns=*.jar
z,Application.properties
jeśli takie istniejąźródło
Wszystkie odpowiedzi na to pytanie pomogły mi, ale pomyślałem, że dodam dodatkowe informacje dla potomności.
Okazało się, że miałem testową zależność od
gwt-test-utils
której przyniosłemgwt-dev
paczkę. Niestetygwt-dev
zawiera pełną kopię Jetty, JSP, JSTL itp., Która wyprzedziła odpowiednie pakiety w ścieżce klas. Więc mimo że miałem odpowiednie zależności od JSTL 1.2, załadowałbym wewnętrzną wersję 1.0 dogwt-dev
. Narzekać.Rozwiązaniem dla mnie było nie uruchamianie z zakresem testowym, więc nie odbieram
gwt-test-utils
pakietu w czasie wykonywania. Usunięciegwt-dev
pakietu ze ścieżki klas w inny sposób również rozwiązałoby problem.źródło
Właśnie miałem podobny problem w Eclipse naprawiony z:
coś go wcześniej wyrzuciło, kiedy edytowałem plik pom.xml
Miałem wszystkie potrzebne pliki jar, taglib uri i web.xml były w porządku
źródło
Odpowiedź na rok 2020
Pytanie jest nadal bardzo popularne, ale wszystkie odpowiedzi są poważnie nieaktualne. Wszystkie komponenty Java EE zostały podzielone na różne projekty Dżakarty i nie inaczej jest z JSTL. Oto poprawne zależności Mavena na dzień dzisiejszy:
<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>
Tak, wersje i groupIds nie są zgodne, ale jest to dziwactwo obecnego stanu projektu .
źródło
To zadziałało dla mnie
<groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version>
źródło
Miałem ten sam problem, używam eclipse, na wypadek, gdyby inni napotkali ten sam problem:
W eclipse kliknij dwukrotnie serwer tomcat,
zatrzymaj serwer,
odznacz opcję „moduły serwera bez publikacji”
uruchom serwer.
źródło
Rozwiązano podobny problem w IBM RAD 7.5, wybierając:
źródło