Wie kommst du embedded Jetty 9 erfolgreich zu lösen das JSTL-Tag-URI?
Ich bin Verpackung ein Web Application Archive (.Krieg), so dass es gestartet werden kann über java -jar webapp.war
in einer shell startet eine eingebettete Kopie der Steg 9 mit diesem code in einer main-Klasse:
int port = Integer.parseInt(System.getProperty("port", "80")); //I know this has implications :)
String contextPath = System.getProperty("contextPath", "");
Server server = new Server(port);
ProtectionDomain domain = Deployer.class.getProtectionDomain();
URL location = domain.getCodeSource().getLocation();
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/" + contextPath);
webapp.setWar(location.toExternalForm());
server.setHandler(webapp);
server.start();
server.join();
Ich bin allerdings läuft in diesen Fehler, wenn die ersten JSP mit einer JSTL-taglib-Deklaration kompiliert wird:
org.apache.jasper.JasperException: /WEB-INF/html/user/login.jsp(2,62) PWC6188: The absolute uri: http://java.sun.com/jsp/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:92)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:378)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:172)
at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:431)
at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:240)
at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:502)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:582)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1652)
at org.apache.jasper.compiler.Parser.parse(Parser.java:185)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:244)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:145)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:212)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)
etc...
Den ersten paar Zeilen, dass JSP sind wie folgt:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Ist, habe ich mich um einiges (dies scheint nicht zu einem neuen Thema) und haben versucht, die folgenden Lösungen:
- Abnehmen meine Abhängigkeiten und sucht Konflikte (derzeit bin ich nur abhängig von der
jetty-server
jetty-webapp
undjetty-jsp
alle version9.0.4.v20130625
) - Die Angabe einer expliziten
<taglib>
Zuordnung in der webapp ist web.xml Datei, die Punkte zu JSTL direkt (habe diese Idee aus der Lektüre der JSP-spec) - Ändern den server-classpath als pro diese Antwort
- Unter Ausnutzung von Methoden der WebAppContext wie
addServerClass
undsetParentLoaderPriority
Laut Der Jetty-Dokumentationmit JSTL sollte nur arbeiten, aber ich denke, der Kontext eingebettet werden können, verändert die Art, wie JSTL geladen wird und verursacht es zu scheitern.
Würde schätzen, irgendwelche Ideen oder Vorschläge. Dieses setup würde ersetzen ein älteres setup, das hat die gleiche Sache erfolgreich unter Windows, war aber nicht funktionieren auf Linux aufgrund der Aufnahme von einer alten Abhängigkeit brachte, dass Sie in dieser Fehler. Leider, ich habe nicht in der Lage gewesen, einen schnellen Ersatz für die Abhängigkeit (groupId org.mortbay.jetty
artifactId jsp-2.1-glassfish
version 2.1.v20100127
) nicht vorstellen das JSTL-Tag-URI stack-trace erwähnt.
UPDATE: die ich gefunden habe, eine suboptimale Lösung. Ein downgrade auf Jetty 7 inspiriert von dieser thread jetzt hat mich zum laufen. Dies ist eine gute Nachricht, aber es ist entmutigend, dass wenn ich später erforderliche Funktionalität exklusiv für Jetty 8 oder Steg 9, dass ich Schrott diese Bereitstellung der Infrastruktur. Jeder Einblick auf JSTL taglib Problem in Jetty 9 würde immer noch geschätzt werden.
InformationsquelleAutor der Frage William Proffitt | 2013-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, hier ist noch eine andere Lösung. Ich war kämpfen mit sehr ähnlichen problem, nur habe ich eine separate war-Datei und eine einfache embedder-Klasse, die schafft einen Jetty-server für mich und startet es zeigen, um möglicherweise einer war-Datei. Hier ist, wie diese funktionieren alle.
War-Datei, die keine tld-Bibliothek in
WEB-INF/lib
und ist völlig getrennt von der loader-miniapplication.Den Loader-Anwendung, die Main-Klasse, die den server gestartet hat, und Punkte, die es zu jedem Krieg-Datei hat folgenden Abhängigkeiten (maven):
Dem laden der Klasse selbst sieht aus wie:
Das resultierende Paket in meinem Fall sieht das wie folgt aus:
Meine Abhängigkeiten wurden einfach Hinzugefügt, über die Montage plugin als
Habe ich eine shell starten, script starten die Einbettung Klasse und hier kommt das, was hat mich Alter, um herauszufinden.
Habe ich eine manifest-Datei mit der classpath-eingebettet in das Glas und meine Einstellung
CLASSPATH=<PATH_TO_APP>\lib\EmbeddedApp.jar
vorausgesetzt, die reset-die Abhängigkeiten sind Teil meiner classpath durch das manifest. Und ich war gettign die gleichen Regional-URI-Fehler.Einmal habe ich Hinzugefügt, verändert die
CLASSPATH
variable in meinem Skript enthalten alle Gläser gilt es zu arbeiten begonnen.Hoffe, dies kann sparen Sie die Zeit 🙂
InformationsquelleAutor der Antwort Jan Zyka
Ich hatte das gleiche problem starting Jetty von einer Surefire zu testen; das problem war, dass der Jetty-9 wirkt nicht auf die manifeste, der alle jar-Dateien, außer in WEB-INF, was unvereinbar ist mit der Art, wie ich geschrieben hatte, meine tests.
Um das problem zu umgehen, schrieb ich ein kleines Stück code zu finden, der jar-Dateien aus dem manifest, und legen Sie Sie in eine neue intermediate URLClassLoader.
Dies ist, was mein Funktionstest setup-Funktion landete auf der Suche wie man es an die Arbeit mit Jetty 9:
Mein code-Beispiel ist in der public domain platziert - Sie können verwenden Sie es in Ihrem eigenen code (attribution geschätzt, aber nicht erforderlich).
InformationsquelleAutor der Antwort a1kmm
Nach hantieren mit a1kmm Lösung und endend mit NullPointers ich bemerkte, dass ich auch kein Classloader auf die WebAppContext. Mit der folgenden Zeile, die ich nicht mehr brauche, die Brauch zum laden von Klassen/manifest der scan-Einrichtung.
InformationsquelleAutor der Antwort Silvester van der Bijl
Ich hatte genau dieses problem. Und ich löste es in den meisten ungewöhnliche Art und Weise.
Ich bin mit Maven als build-tool, aber hier ist, wie ich bauen mein self-exec-KRIEG.
Aber wie sich war ich immer diesen Fehler. Nach Googeln der Tod es nach 2 Tagen fand ich diese - http://internna.blogspot.co.uk/2011/08/step-by-step-executable-war-files.html
Durch den Wechsel aus der jetty-jsp-Abhängigkeit für diesen:
Alles begann magisch zu arbeiten!
Ab diesem moment kann ich nicht erklären, warum es funktioniert. Aber ich bin daran interessiert, zu erfahren
InformationsquelleAutor der Antwort James 'Cookie' Cook
Habe ich gerade erstellt einfache jsp mit ta-taglib verwenden. Dann erstellte server-app, und es funktioniert.
Also, ich denke, es ist nicht eine taglib, die das problem verursacht.
InformationsquelleAutor der Antwort Valery-Sh
Leider keine Antworten bisher gearbeitet haben für mich. Aber schließlich fand ich eine Lösung für mein Problem. Das hört sich an wie ein hack, und es fühlt sich definitiv an wie ein.
Aber wenn ich alles so einzurichten, wie ich es beschrieben in meiner Frage, bis zu dem Punkt, wo die JSTL nicht beheben, kann ich dann einen Schritt macht alles Arbeit, fast wie Magie.
Kriechen-induzierende Schritt ist die änderung der Erweiterung auf die
.war
Datei zu.jar
. Sobald ich das Tue, ist das JSTL-Tag löst nur gut, und alles funktioniert.So, jetzt produziere ich einen
.war
dass Sie stick in einen servlet-container, oder Sie können Sie umbenennen, um.jar
und laufen standalone. Und es funktioniert sowohl auf Unix und Windows, in der Erwägung, dass die Art, wie ich war, dies zu tun, bevor Sie nicht funktionieren würde, die auf Unix-aufgrund eines Fehlers in der vorliegendejsp-2.1-glassfish
Bibliothek erwähnt, die von James Cook.Die relevanten bits aus meinem pom:
InformationsquelleAutor der Antwort William Proffitt
Scheint es, dass embedded-jetty-9 nicht gerne verwendet automatisch alle class-path-Einträge aus Ihrem Haupt-ausführbare jar-Datei. Dies beinhaltet die taglib-Bibliotheken. Hinzufügen von class-path-Einträge direkt auf die webappclassloader scheint nicht zu funktionieren. Aus welchem Grund auch immer die class-path-Einträge müssen Hinzugefügt, um einen Elternteil von der webappclassloader.
Die einfache Lösung bei mir nicht funktioniert:
Aber das Scannen der manifestiert sich durch hand habe. Ich neu schrieb den oben genannten scan-Beispiel, nur konnte ich sehen, was Los ist, und versuchen, verschiedene Dinge, die werde ich hier.
Diese ersetzen sollte, die embedded-jetty-jsp-Beispiel, das funktioniert einfach nicht, aus welchem Grund auch immer, sollte aber, wie jedem class-path-Einträge sollten automatisch in den classpath. Er sagt jedoch, dass JSP erfordert eine NICHT-system-class-loader. Also ich kann nur davon ausgehen, dass JSP bricht den Scanvorgang ab der Klasse Weg, sobald es erreicht den System-classpath loader. Das ist der Grund, warum wir effektiv haben, um es zu ersetzen.
InformationsquelleAutor der Antwort jeremiah jahn
Fügen Sie das fat-jar-as-a-WEB-INF jar, lassen Sie die
MetaInfConfiguration
zu finden *.tld-Dateien.Referenz:
InformationsquelleAutor der Antwort zhongl