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


134

Я не знаю, що я зробив неправильно, але я не можу включити 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
Мені довелося додати також залежність талібів поруч з 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 таліб на основі документації 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 + 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>

Користувачі, які не користуються Maven, можуть досягти цього, скинувши фізичний файл jstl-1.2.jar у /WEB-INF/libпапку проекту веб-додатків (не роблять абсолютно не викидати стандартний.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
Тоді ваш класний шлях - безлад. Почистіть його. Я не знаю, що робить Maven і чи розумний він, але для JSTL 1.2 таліг не потрібен standard. Детальніше прочитайте сторінку інформації про теги.
BalusC

4
Мені дуже подобається вікі-сторінка JSTL, яку ви складаєте разом. Однак, оскільки це питання є найкращим зверненням 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. Перевірте версію сервлетів у веб.xml: <web-app version="2.5">

  2. Перевірте, чи підтримується версія JSTL для цієї версії сервлетів: версія Servlet 2.5 використовує JSTL 1.2 або версія Servlet 2.4 використовує JSTL 1.1

  3. У вашому контейнері сервлетів повинна бути відповідна бібліотека, або ви повинні включити її вручну у свою програму. Наприклад: JSTL 1.2 вимагає jstl-1.2.jar

Що робити з Tomcat 5 або 6:

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

Останнє - це таліб у ваших jsp-файлах. Для JSTL 1.2 правильним є таке:

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

3
Я помітив, що це питання досить популярне (багато глядачів). Ось чому я вирішив написати короткий підручник, як боротися з цією проблемою
lukastymo

17

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


Так!. Я також. Хто - то (= сам) в деякій точці покласти tomcat.util.scan.StandardJarScanFilter.jarsToSkip=* в catalina.propertiesфайл в (незрозумілим?) Намагатися прискорити Tomcat час запуску. Архх!
peterh

Я використовую такий сценарій, щоб створити список jarsToSkip, який уникає TLD та банки з веб-фрагментами: 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" %>

Також , будь ласка , перевірте наявність баночки залежностей , які ви додали javax.servlet.jarі javax.servlet.jsp.jstl-1.2.1.jarчи немає в вашому WEB-INF / Lib папки. У моєму випадку ці двоє вирішили питання.


Будь ласка , ви можете поглянути на питання тут [ stackoverflow.com/questions/44039706 / ...
Kasun Siyambalapitiya

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 у пом для моєї залежності jstl 1.2. Знову ж не впевнений, чому це виправлено, але про всяк випадок, коли хтось веде з підручника JPA та Hibernate з питань плюралізму та налаштує їх таким чином, спробуйте видалити тег області та перевірте, чи це виправить. Як я сказав, це працювало на мене.


2

Я повністю відключив інструменти MAVEN та Spring. І мені довелося додати наступні банки для того, щоб моє середовище працювало правильно.

  • весна-aop-4.0.3.RELEASE.jar
  • spring-beans-4.0.3.RELEASE.jar (важко знайти це виправлення, інші org.springframework <3.versions> просто не працювали.
  • весна-контекст-4.0.3.RELEASE.jar
  • spring-core-4.0.3.RELEASE.jar
  • весна-вираз-4.0.3.RELEASE.jar
  • весна-web-4.0.3.RELEASE.jar
  • spring-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працювати на мене, і я не маю поняття, чому.
авояк

1

Якщо ви використовуєте Spring завантаження, подумайте , щоб видалити 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, таліб урі та web.xml було нормально


0

Відповідь на 2020 рік

Питання все ще дуже популярне, але всі відповіді серйозно застаріли. Всі компоненти Java EE були розділені на різні проекти Джакарти, і JSTL не відрізняється. Ось ось правильні залежності Мейвена на сьогодні:

<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-impl-1.2.5-migrated-0.0.1.jar * taglibs-standard-spec-1.2.5-migrated- 0.0.1.jar ця бібліотека може бути отримана з tomcat10 зразка WebApps також DonT сканування бібліотеки тегів-стандарту * в якості TLD файлів там, це може бути відключити в context.xml в WebApp META-CONF Lib
Jasonw


-1

У мене була така ж проблема, я використовую eclipse, на випадок, якщо інші відчувають цю проблему:
У затемненні двічі клацніть сервер tomcat,
зупиніть сервер, щоб
відміняти "серверні модулі без публікації"
запустіть сервер.

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


-2

Подібну проблему вирішено в IBM RAD 7.5, вибравши:

  1. Властивості проектів
  2. Фасетки проекту
  3. JSTL прапорець
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.