Не может загружать теги JSTL на встроенном сервере Jetty

Я пишу веб-приложение, которое выполняется внутри встроенного экземпляра Jetty.

Когда я пытаюсь выполнить оператор JSTL, я получаю следующее исключение:

org.apache.jasper.JasperException:/index.jsp(1,63) PWC6188: Абсолютный uri: http://java.sun.com/jsp/jstl/core не может быть разрешен либо в файле web.xml, либо в файлах jar, развернутых с этим приложением

У меня есть следующие банки в пути к классам

  • ant -1.6.5.jar
  • ant -1.7.1.jar
  • ant -launcher-1.7.1.jar
  • ядро-3.1.1.jar
  • Причал-6.1.22.jar
  • Причал-Util-6.1.22.jar
  • JSP-2.1-6.1.14.jar
  • JSP-апи-2.1.jar
  • JSTL-1.2.jar
  • сервлет-апи-2.5-20081211.jar
  • сервлет-апи-2.5-6.1.14.jar
  • Стандарт-1.1.2.jar

Мой web.xml выглядит следующим образом:

<?xml version="1.0" encoding="ISO-8859-1"?>  
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee h77p://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"  
    version="2.4">  
    <display-name>test</display-name>  
</web-app>

Мой код выглядит следующим образом:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<html>  
    <body>  
        <h2>Hello World!</h2>  
        <%= new java.util.Date() %><br/>  
        ${1+2}<br/>  
        <c:out var="${5+9}"/><br/>  
    </body>  
</html>

Я запустил встроенный сервер Jetty следующим образом:

Server server = new Server(80);  
WebAppContext context = new WebAppContext("pig-1.0-SNAPSHOT.war","/");
server.addHandler(context);
server.start();

Я провел последние два дня, экспериментируя с различными комбинациями файлов jar, конфигураций web.xml и деклараций библиотеки тегов, но безрезультатно.

Как я могу запустить встроенный сервер Jetty с полной поддержкой JSTL?

Ответ 1

Jetty 8.0, который по умолчанию используется, когда вы используете jetty: run, имеет сервлет API 3.0. Начиная с этой версии стандарта, стандарт JSTL должен быть включен, и эти taglib не могут находиться в пути класса webapp, а только в стандартном classpath. Однако 8.0.0.M0 забыли включить их.

Указание 7.1.4.v20100610 помогло мне.

Ответ 2

Тег jstl должен быть в сервере classpath. Вы можете добавить загрузчик классов к текущей цепочке загрузчиков классов, прежде чем запускать сервер. Это принцип, используемый start.jar при запуске сервера причала.

ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
URL urlTaglibs = new File(PATH_TO_TAGLIBS).toURI().toURL();
URLClassLoader newClassLoader = new URLClassLoader(new URL[]{urlTaglibs},currentClassLoader);
Thread.currentThread().setContextClassLoader(newClassLoader);

server.start();

Вы также должны добавить его в аргумент командной строки java start.

Ответ 3

  • JSTL-1.2.jar
  • Стандарт-1.1.2.jar

Это сталкивается. Удалите standard-1.1.2.jar. Вы должны использовать standard-1.1.2.jar только с помощью jstl-1.1.2.jar. Начиная с JSTL 1.2, стандартный JAR был объединен в JSTL JAR, в результате чего появился один файл jstl-1.2.jar.

Ответ 4

@Drew Спасибо Дрю. Это работает. Я искал это для этого и оказался здесь. Какая моя ошибка была: Я использовал

                 <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>jstl</artifactId>
                     <version>1.1.2</version>
                     <scope>provided</scope>
                </dependency>

Я изменил его сверху на

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

и он работал. Также я использовал jstls-зависимость, которую я удалил.

Ответ 5

У меня такая же проблема на Jetty 7, Я решил это, разрешив Jetty искать TLD:

Я сделал это, установив атрибут в контексте:

Server server = new Server(80);  
WebAppContext context = new WebAppContext("pig-1.0-SNAPSHOT.war","/");
context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", 
    ".*/.*jsp-api-[^/]*\\.jar$|.*/.*jsp-[^/]*\\.jar$|.*/.*taglibs[^/]*\\.jar$");
server.addHandler(context);
server.start();

Обратитесь к http://wiki.eclipse.org/Jetty/Howto/Configure_JSP#Using_JSTL_Taglibs_for_Jetty_7.x_and_8.x для более подробной информации.

В моем проекте (с использованием maven) у меня есть стандартные TLD в JAR "org.apache.taglibs.standard.glassfish-1.2.0.v2011120803.jar", и теоретически этого было бы достаточно для использования в качестве значения для ContainerIncludeJarPattern следующий шаблон:

".*/org\\.apache\\.taglibs\\.standard\\.glassfish-1\\.2\\.0\\.v201112081803\\.jar"

На самом деле это работает, и это подтверждение того, где причал нашел теги libs, но я предпочел оставить предыдущий шаблон, который я нашел на странице wiki.eclipse.org, приведенной выше.

Может потребоваться расширить шаблон, если вы хотите включить пользовательские библиотеки тегов.

Ответ 6

У меня была та же проблема и выяснилось, что http://java.sun.com/jsp/jstl/core рассматривается как единый системный URI, и все определения taglib, которые пытаются его определить, игнорируются (но при упоминании все равно возникает ошибка).

Я использовал следующее, прежде чем запускать Jetty, и теперь он работает:

try {
    Field f = TldScanner.class.getDeclaredField("systemUris");
    f.setAccessible(true);
    ((Set)f.get(null)).clear();
} catch (Exception e) {
    throw new RuntimeException("Could not clear TLD system uris.",e);
}

Ответ 7

Два шага:

1) добавить поддержку аннотаций для сервера

//Включить парсинг jndi-связанных частей web.xml и jetty-env.xml, #server

org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList.setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.PlusConfiguration");
classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration");

2) добавить атрибут follow к WebAppContext

context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/org.apache.taglibs.taglibs-standard-impl-.*\\.jar$");

Ответ 8

В вашем web.xml попробуйте изменить "h77p://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" , чтобы начать с "http://" и посмотрите, исправляет ли это ошибку.

Однако это не может быть основной причиной, так как у меня была такая же ошибка при использовании плагина Jetty-maven-plugin и JSTL taglib в моем JSP:

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

PWC6188: Абсолютный uri: http://java.sun.com/jsp/jstl/coreне может быть разрешено в web.xml или файлы jar, развернутые с этим Приложение

Я использую готовый шаблон Spring MVC от SpringSource Tool Suite, поэтому не знаю, почему плагин Maven для Jetty дросселирует на нем.

<build>
   <plugins>
      <plugin>
         <groupId>org.mortbay.jetty</groupId>
         <artifactId>jetty-maven-plugin</artifactId>
      </plugin>
   </plugins>
</build>
<repositories>
     <repository>
       <id>maven2-repository.dev.java.net</id>
       <name>Java.net Repository for Maven</name>
       <url>http://download.java.net/maven/2/</url>
       <layout>default</layout>
     </repository>
</repositories>

И только javax.servlet: jstl: 1.2 указан в моих зависимостях POM, так как теперь он устаревает taglibs: standard: 1.1.2, что было предложено выше.

Ответ 9

У меня также были те же проблемы. Я исправил его, добавив ниже код:

public static final String[] TLD_JAR_NAMES = new String[]{"sitemesh", "spring-webmvc", "shiro-web", "springside-core"};
...
JettyFactory.setTldJarNames(server, TLD_JAR_NAMES);

Возможно, вы можете попробовать. Пожалуйста, замените TLD_JAR_NAMES своими реальными именами JLD TLD.

Ответ 10

Добавив следующий код, я избавился от проблемы:

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>jasper</artifactId>
    <version>6.0.29</version>
</dependency>

Я использую приманку 8.