Embedded Jetty no puede cargar taglibs JSP cuando se especifica classpath en jar

Me encuentro con un problema que no parece ser abordado por preguntas similares.

Tengo una aplicación que integra Jetty, usando SpringMVC, JSP y taglibs. Utilizo un complemento de maven para generar un jar, agrupar todos los jar dependientes en un directorio y crear un manifiesto.

Cuando ejecuto la aplicación usando el jar (por ejemplo, java -jar app.jar), todo funciona bien hasta que intento cargar un JSP que especifica <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> o cualquier otro taglib para el caso.

Si ejecuto java y especifico la ruta de clase en la línea de comando y nombro mi clase principal explícitamente, todo funciona. He verificado que el Class-Path dentro de mi jar de aplicaciones MANIFEST.MF es correcto.

Hasta ahora se me han ocurrido 2 soluciones alternativas que preferiría evitar. Haga que mi secuencia de comandos de inicio genere la ruta de clase y la coloque en la línea de comandos. O extraiga los archivos .tld del paquete Jetty jsp-api y póngalos a disposición como archivos normales, lo que me permite especificarlos como taglibs.

Tengo entendido que se supone que Jasper debe atravesar todas las rutas de clases de Jar en busca de archivos tld. Al especificar los frascos en la línea de comando como parte de la ruta de clases, funciona, pero cuando la ruta de clases se especifica en el frasco de mi aplicación, falla.

preguntado el 16 de mayo de 11 a las 16:05

2 Respuestas

Encontré la solución. Resulta que al incrustar Jetty y no usarlo para cargar una aplicación web, algunas cosas simplemente no funcionan porque no es una convención estándar. La extracción de los archivos tld en src / main / resources / META-INF / tld permitió encontrarlos en tiempo de ejecución cuando la ruta de clases se especifica en el jar.

contestado el 18 de mayo de 11 a las 00:05

No estoy seguro de los detalles de Jetty y cómo se supone que funciona, pero normalmente debería ser suficiente con colocar el archivo JSTL JAR en /WEB-INF/lib carpeta de la aplicación web. ¿Está ahí?

Un contenedor de servlet normal no escanea el %CLASSPATH% variable de entorno ni la Class-Path en cualquiera de los archivos JAR para buscar dependencias específicas de la aplicación web. En su lugar, solo cargará todos los archivos JAR en el /WEB-INF/lib según las especificaciones del servlet.

La %CLASSPATH% la variable de entorno es por defecto solamente usado cuando ejecutas java or javac comando sin que el -cp, -classpath y -jar argumentos. El Class-Path la entrada en JAR es solamente utilizado cuando ejecuta el JAR en cuestión utilizando -jar argumento. Pero la aplicación web en sí misma no es ejecutada por java -jar. Es cargado y ejecutado por el propio servletcontainer de acuerdo con la especificación del servlet.

contestado el 16 de mayo de 11 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.