che sto confezionamento di una Web Application Archive (.war) in modo che possa essere avviato tramite java -jar webapp.war
in un guscio con il lancio di una copia incorporata di Jetty 9 utilizzando questo codice in una classe principale:Come si ottiene il Jetty 9 incorporato per risolvere correttamente l'URI JSTL?
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();
Tuttavia, io corro in questo errore quando il primo JSP contenente una dichiarazione JSTL taglib viene compilato:
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...
la coppia prime righe di quel JSP sono i seguenti:
<%@ 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" %>
Ho guardato in giro un bel po '(questo non sembra essere una nuova emissione) e ho provato le seguenti soluzioni:
- snellimento mie dipendenze e alla ricerca di conflitti (attualmente sto solo in funzione su
jetty-server
,jetty-webapp
ejetty-jsp
, tutte le versioni9.0.4.v20130625
) - Specifica di un esplicito
<taglib>
mappatura nel file web.xml del webapp che punta direttamente a JSTL (ottenuto questa idea dalla lettura della specifica JSP) - modifica del percorso di classe server come per this answer
- Approfittando di metodi di WebAppContext quali
addServerClass
esetParentLoaderPriority
Secondo Jetty's documentation, usando JSTL dovrebbe funzionare, ma penso che il contesto incorporato può cambiare il modo in cui viene caricato JSTL e causando il fallimento.
Apprezzerebbero qualsiasi idea o suggerimento. Questa installazione sostituirà una vecchia configurazione che ha fatto la stessa cosa con successo su Windows ma non funzionava su Linux a causa dell'inclusione di una vecchia dipendenza che portava this bug. Sfortunatamente, non sono stato in grado di trovare una sostituzione rapida per tale dipendenza (groupIdartefactId jsp-2.1-glassfish
versione 2.1.v20100127
) che non introduce la traccia dello stack URI JSTL menzionata sopra.
UPDATE: Ho trovato una soluzione non ottimale. Un downgrade a Jetty 7 ispirato a this thread ora mi ha installato e funzionante. Questa è un'ottima notizia, ma è scoraggiante che, se in seguito avessi richiesto una funzionalità esclusiva per Jetty 8 o Jetty 9, avrei dovuto eliminare questa infrastruttura di distribuzione. Qualsiasi intuizione sul problema del taglib JSTL in Jetty 9 sarebbe comunque apprezzata.
Questa soluzione funziona per Jetty 9.0, ma non 9.1 –
Inoltre, non causa problemi per Jetty 8.1 –