не может загрузить JSTL taglib на встроенном сервере Jetty - PullRequest
15 голосов
/ 28 января 2010

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

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

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

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

  • муравей-1.6.5.jar
  • муравей-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?

Ответы [ 10 ]

8 голосов
/ 12 октября 2012

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

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.

8 голосов
/ 03 июля 2010

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

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

5 голосов
/ 28 января 2010
  • 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.

3 голосов
/ 03 сентября 2010

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

                 <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-зависимость, которую я удалил.

2 голосов
/ 05 июня 2014

У меня была такая же проблема, и я обнаружил, что 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);
}
2 голосов
/ 20 сентября 2013

У меня такая же проблема на 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"

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

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

1 голос
/ 11 августа 2016

Два шага:

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

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

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$");
0 голосов
/ 23 июля 2014

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

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

Я использую Jetty-Runner 8.

0 голосов
/ 16 июня 2013

У меня тоже были такие же проблемы. Я исправил это, добавив следующий код:

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 вашими реальными именами банок TLD.

0 голосов
/ 17 апреля 2010

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

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

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

PWC6188: абсолютное значение: 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, что было предложено выше.

...