2010-01-27 11 views
15

Ich schreibe eine Webanwendung, die innerhalb einer eingebetteten Jetty-Instanz ausgeführt wird.kann JSTL Taglib innerhalb eingebetteten Jetty Server nicht laden

Wenn ich eine JSTL-Anweisung auszuführen versuchen, erhalte ich die folgende Ausnahme:

org.apache.jasper.JasperException: /index.jsp(1,63) PWC6188: Die absolute uri: http://java.sun.com/jsp/jstl/core kann nicht entweder in web.xml oder die jAR-Dateien mit dieser Anwendung

ich habe folgende Gläser auf dem classpath

  • ant-1.6.5.jar eingesetzt werden aufgelöst
  • Ameisen 1.7.1.jar
  • ant-Launcher-1.7.1.jar
  • Kern-3.1.1.jar
  • Anlegesteg-6.1.22.jar
  • Anlegesteg-util-6.1 .22.jar
  • jsp-2.1-6.1.14.jar
  • jsp-api-2.1.jar
  • jstl-1.2.jar
  • Servlet-api-2.5-20081211.jar
  • Servlet-api-2.5-6.1.14.jar
  • Standard-1.1.2.jar

Meine web.xml wie folgt aussieht:

<?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> 

Mein Code sieht wie folgt aus:

<%@ 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> 

ich meine eingebetteten Jetty Server wie folgt gestartet:

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

Ich verbrachte die letzten zwei Tage damit, mit verschiedenen Kombinationen von JAR-Dateien, web.xml-Konfigurationen und Tag-Bibliothek-Deklarationen zu experimentieren, aber ohne Erfolg.

Wie kann ich einen eingebetteten Jetty-Server mit voller JSTL-Unterstützung einrichten?

Antwort

4
  • jstl-1.2.jar
  • Standard-1.1.2.jar

Dies kollidiert. Entfernen Sie die standard-1.1.2.jar. Sie sollten standard-1.1.2.jarnur mit jstl-1.1.2.jar verwenden. Seit JSTL 1.2 wurde die Standard-JAR in JSTL JAR zusammengeführt, was zu einer einzigen jstl-1.2.jar Datei führt.

+0

Gut zu wissen, danke! Nach dieser Änderung bleibt das Problem bestehen. –

+0

Stellen Sie sicher, dass Sie keine JSTL JAR-Datei extrahiert und keine TLD-Dateien in den Klassenpfad aufgenommen oder irgendetwas in 'web.xml' definiert haben. Stellen Sie außerdem sicher, dass Sie die JSTL JAR-Datei (en) nicht woanders platziert/dupliziert haben, z. in 'Appserver/lib' oder' JRE/lib'. Um JSTL zu installieren, müssen Sie lediglich die JAR-Datei im Klassenpfad ablegen (z. B. '/ WEB-INF/lib') und die Taglib oben in der JSP-Datei deklarieren. Das sollte es sein. Es muss wirklich nichts mehr getan werden, sonst wird es irgendwo kollidieren. – BalusC

0

In Ihrem web.xml, versuchen Ändern "h77p: //java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" mit zu beginnen "http: //" und sehen, ob das behebt den Fehler

jedoch nicht die zugrunde liegende Ursache sein kann, da ich den gleichen Fehler hatte bei der Verwendung von Anlegesteg-Maven-Plugin und JSTL taglib-Header in meiner JSP:

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

PWC6188: Die absolute uri: http://java.sun.com/jsp/jstl/core kann nicht in beiden web.xml oder die jAR-Dateien mit dieser Anwendung

ich bin mit einem out- Einsatz gelöst werden Spring-MVC-Vorlage von SpringSource Tool Suite, also bin ich mir nicht sicher, warum das Maven-Plugin für Jetty darauf drosselt.

<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> 

Und nur javax.servlet: jstl: 1.2 in Abhängigkeiten aufgeführt ist mein POM, da es nun Taglibs obsolet: standard: 1.1.2, die ein Vorschlag oben gegeben ist.

8

Jetty 8.0, die als Standard bei der Verwendung von Jetty gedrückt hat: run, hat Servlet API 3.0. Ab dieser Version des Standards soll der JSTL-Standard enthalten sein, und diese Taglibs dürfen nicht im Klassenpfad des Webapps enthalten sein, sondern nur im Standardklassenpfad. 8.0.0.M0 vergaß jedoch, sie aufzunehmen.

Die Angabe 7.1.4.v20100610 half mir.

+0

Diese Lösung funktionierte auch für mich, aber ich würde gerne wissen, was das eigentliche Problem ist. Mit Steg 8.x hatte ich kein Problem "mvn jetty: run" laufen zu lassen, aber "java -jar target/dependency/jetty-runner.jar target/*. War" würde nicht funktionieren (was ich brauchte um meine Web App zu starten auf Heroku). Als ich zu 7. wechselte, schien alles magisch zusammenzukommen. – kburns

+0

Es (war) nur ein Fehler in 8.0M0. – bmargulies

3

@Drew Dank Drew. Es works.I war für diese googeln und am Ende here.What mein Fehler war: ich

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

mit war ich es von oben zu

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

und es hat funktioniert. Auch ich habe jstls Abhängigkeit verwendet, die ich entfernte.

8

Die jstl Taglibs müssen auf Server Klassenpfad sein. Sie können der aktuellen Classloader-Kette einen Classloader hinzufügen, bevor Sie den Server starten. Das ist das Prinzip, das von start.jar verwendet wird, wenn es einen Anlegestegserver startet.

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(); 

Sie sollten auch zu Befehlszeilenargument Java Start hinzuzufügen.

+0

+1 Für * eine Lösung *: diese Frage wiederholt sich etwa 10 mal in SO und alle vorgeschlagenen Lösungen (fügen Sie explizit jstl JAR zur META-INF \ MANIFEST.MF hinzu, entfernte kollidierende Servlet-JARs usw.) funktionieren einfach nicht. Danke Arsouille! –

0

Ich hatte auch die gleichen Probleme. Ich habe es mit dem folgenden Code behoben:

Vielleicht können Sie es versuchen. Bitte ersetzen Sie TLD_JAR_NAMES durch Ihre echten TLD Jar-Namen.

2

habe ich das gleiche Problem auf Jetty 7, Ich löste es Jetty indem es für TLD suchen:

ich es tat, indem Sie auf den Kontext ein Attribut festlegen:

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(); 

Siehe http://wiki.eclipse.org/Jetty/Howto/Configure_JSP#Using_JSTL_Taglibs_for_Jetty_7.x_and_8.x für weitere Details.

Auf meinem Projekt (mit Maven) habe ich Standard-TLDs sind auf der JAR "org.apache.taglibs.standard.Glassfish-1.2.0.v2011120803.jar“und theoretisch wäre es genug sein als Wert verwenden für ContainerIncludeJarPattern folgendes Muster:

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

Es funktioniert tatsächlich und es ist eine Bestätigung von wo Anlegesteg gefunden der Tag-Libs, aber ich habe bevorzugt das vorherige Muster zu verlassen, die ich auf der wiki.eclipse.org Seite gefunden oben verlinkten.

Es kann erforderlich sein, das Muster zu verlängern, wenn Sie benutzerdefinierten Tag libs aufnehmen mögen.

2

I hatte das gleiche Problem und fand heraus, dass http://java.sun.com/jsp/jstl/core als der Single-System-URI und alle Taglib-Definitionen t betrachtet wird Hat versucht, es zu definieren, wird ignoriert (aber wenn referenziert wird, tritt trotzdem ein Fehler auf).

verwendete ich folgendes vor der Anlegestelle beginnen und jetzt funktioniert es:

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); 
} 
+0

Wie im Namen von Hades ... das hat es getan, es hat mein Problem behoben. Vielen Dank! –

+0

Vielen Dank – littlejedi

+0

Gern geschehen. Schön, dass ich zurückgeben kann ... :) – Daniel

0

Durch den folgenden Code hinzugefügt ich das Problem losgeworden:

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

Ich bin mit Anlegesteg-Läufer 8 .

1

Zwei Schritt: Anmerkung Unterstützung für den Server

1) hinzufügen

// Parsing von jndi bezogenen Teile von web.xml und Steg-env.xml aktivieren, #server ist

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) fügen Sie das Follow-Attribut auf die WebAppContext

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