Как установить JSTL? Абсолютный uri: http://java.sun.com/jstl/core не может быть разрешен


135

Я не знаю, что я сделал неправильно, но я не могу включить 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 рядом с jstl, и я просто работал.
Кристиан Вильма

Ответы:


193

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 тоже).

Итак, исправьте URI taglib соответственно на основе документации JSTL :

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

Кроме того, вам нужно быть абсолютно уверенным, что вы не выбросите несколько разных версий JSTL JAR-файлов вместе в classpath времени выполнения. Это довольно распространенная ошибка среди пользователей Tomcat. Проблема с Tomcat в том, что он не предлагает JSTL из коробки, и, следовательно, вы должны установить его вручную. Это не обязательно в обычных серверах Java EE. Смотрите также Что такое Java EE?

В вашем конкретном случае ваш pom.xml в основном говорит вам, что у вас есть jstl-1.2.jar и standard-1.1.2.jar вместе. Это не верно. Вы в основном смешиваете JSTL 1.2 API + impl от Oracle с JSTL 1.1 impl от Apache. Вам нужно удалить любой standard-xxx.jar. Просто толькоjstl-1.2.jar достаточно.

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

Пользователи Non-Maven может достичь того же, понижая физический JSTL-1.2.jar файл в /WEB-INF/libпапке проекта веб - приложений (сделать абсолютно не уронить standard.jar или ослабленные .TLD файлы там!). Удалите их при необходимости.

Если вы на самом деле используете обычный сервер Java EE, такой как WildFly, Payara и т. Д., Вместо обычного сервлет-контейнера, такого как Tomcat, Jetty и т. Д., То вам вообще не нужно явно устанавливать JSTL. Обычные серверы Java EE уже предоставляют JSTL из коробки. Другими словами, вам не нужно pom.xmlни добавлять 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 или старше. В противном случае выражения 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
Тогда ваш путь к классам - беспорядок. Очистите это. Я не знаю, что делает maven и насколько он умен, но для JSTL 1.2 taglib не нужен standard. Прочтите страницу информации о теге для получения более подробной информации.
BalusC

4
Мне очень нравится созданная вами вики-страница JSTL. Однако, поскольку этот вопрос является наиболее популярным в Google для конкретного сообщения об ошибке, я беру на себя смелость отредактировать его и отметить, что URI «не-jsp» взят из JSTL 1.0.
kdgregory

2
@kdgregory: Спасибо :)
BalusC 08

1
если вы используете Gradle, добавьте эту зависимость:compile('javax.servlet:jstl:1.2')
benscabbia

36

@BalusC полностью прав, но если вы все еще сталкиваетесь с этим исключением, это означает, что вы что-то сделали не так. Самая важная информация, которую вы найдете, находится на странице информации о тегах SO JSTL .

По сути, это сводка того, что вам нужно сделать, чтобы справиться с этим исключением.

  1. Проверьте версию сервлета в web.xml: <web-app version="2.5">

  2. Проверьте, поддерживается ли версия JSTL для этой версии сервлета: версия сервлета 2.5 использует JSTL 1.2 или версия сервлета 2.4 использует JSTL 1.1

  3. Контейнер сервлета должен иметь соответствующую библиотеку, или вы должны вручную включить ее в свое приложение. Например: JSTL 1.2 требует jstl-1.2.jar

Что делать с Tomcat 5 или 6:

Вам необходимо включить соответствующие jar-файлы в каталог WEB-INF / lib (он будет работать только для вашего приложения) или в tomcat / lib (будет работать глобально для всех приложений).

Последнее, что есть в ваших файлах jsp - это taglib. Для JSTL 1.2 правильный вариант:

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

3
Я заметил, что этот вопрос довольно популярен (у многих зрителей). Вот почему я решил написать короткое руководство по решению этой проблемы
lukastymo

17

Я нашел другую причину для этого типа ошибки: в моем случае кто-то установил для свойства conf/catalina.propertiesнастройки значение, чтобы избежать сообщений с предупреждениями в журнале, тем самым пропустив необходимое сканирование Tomcat. Возврат к значению по умолчанию Tomcat и добавление соответствующего списка jar-файлов, которые нужно пропустить (не включая jstl-1.2 или spring-webmvc), решило проблему.tomcat.util.scan.StandardJarScanFilter.jarsToSkip*


Да!. Я тоже. Кто-то (= я) в какой-то момент поместил tomcat.util.scan.StandardJarScanFilter.jarsToSkip=* в catalina.propertiesфайл (неправильно понят?) Попытку ускорить время запуска Tomcat. Arghh!
Питер

Я использую следующий скрипт для создания списка jarsToSkip, который избегает доменов верхнего уровня и jar-файлов веб-фрагментов: pastebin.com/3Bfm1u6K
Moreaki

1
Если вы не хотите менять jarsToSkipнастройки, под ними есть jarsToScanнастройка, которая отменяет все, что указано в jarsToSkip. В итоге мы добавили taglibs*.jarк jarsToScanнашим библиотекам тегов 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" %>

также проверьте, есть ли добавленные вами jar-файлы зависимостей, javax.servlet.jarа javax.servlet.jsp.jstl-1.2.1.jarне в папке WEB-INF / lib. В моем случае эти двое решили проблему.


не могли бы вы взглянуть на вопрос здесь [ stackoverflow.com/questions/44039706/…
Касун Сиямбалапития

10

Добавьте jstl-1.2.jarв tomcat/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" %>

Что решило эту проблему для меня, так это удаление тега области из моего файла xml в pom для моей зависимости jstl 1.2. Опять же, не уверен, почему это исправлено, но на всякий случай, если кто-то делает пружину с помощью JPA и Hibernate, учебник по множественному числу и настроил свой pom таким образом, попробуйте удалить тег области и посмотреть, исправит ли это его. Как я уже сказал, у меня это сработало.


2

Я полностью отключил инструменты MAVEN и Spring. И мне пришлось добавить следующие банки, чтобы моя среда работала правильно.

  • весна-АОП-4.0.3.RELEASE.jar
  • spring-beans-4.0.3.RELEASE.jar (трудно найти это исправление, другие версии org.springframework <3.versions> просто не работали.
  • пружинные контекстно-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, и я не знаю почему.
Avojak

1

Если вы используете Spring загрузки, подумайте , чтобы удалить server.tomcat.additional-tld-skip-patterns=*.jarиз , Application.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 были разделены на различные проекты Джакарты, и 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>

Да, версии и groupId не совпадают, но это особенность текущего состояния проекта .


да, но это не решает мою проблему, но близко, с tomcat10 вам понадобятся две библиотеки * taglibs-standard-impl-1.2.5-migrated-0.0.1.jar * taglibs-standard-spec-1.2.5-migrated- 0.0.1.jar эту библиотеку можно получить из примеров веб-приложений tomcat10, также не сканируйте taglibs-standard *, поскольку там есть файлы tld, это можно отключить в context.xml в веб-приложении META-CONF lib
Jasonw


-1

У меня была такая же проблема, я использую eclipse, на случай, если другие столкнутся с той же проблемой:
в eclipse дважды щелкните сервер tomcat,
остановите сервер,
снимите флажок «серверные модули без публикации»,
запустите сервер.

введите описание изображения здесь


-2

Решена аналогичная проблема в IBM RAD 7.5, выбрав:

  1. Свойства проектов
  2. Аспекты проекта
  3. Флажок JSTL
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.