2010-01-27 26 views
15

Estoy escribiendo una aplicación web que se ejecuta dentro de una instancia incrustada de Jetty.no se puede cargar taglib JSTL dentro del servidor Jetty incrustado

Cuando intento ejecutar una instrucción JSTL, que recibirá la siguiente excepción:

org.apache.jasper.JasperException: /index.jsp(1,63) PWC6188: El URI absoluta: no puede http://java.sun.com/jsp/jstl/core resolverse en cualquiera de los archivos jar desplegados con esta aplicación web.xml o

tengo los siguientes frascos en la ruta de clase

  • hormiga-1.6.5.jar
  • ant-1.7.1.jar
  • ant-lanzador-1.7.1.jar
  • núcleo-3.1.1.jar
  • embarcadero-6.1.22.jar
  • embarcadero-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
  • estándar-1.1.2.jar

Mi web.xml se ve así:

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

Mi código es el siguiente:

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

empecé mi servidor embarcadero incrustado como esto:

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

Pasé los últimos dos días experimentando con varias combinaciones de archivos jar, configuraciones web.xml y declaraciones de biblioteca de etiquetas, pero fue en vano.

¿Cómo puedo poner en funcionamiento un servidor Jetty integrado con soporte completo de JSTL?

Respuesta

4
  • jstl-1.2.jar
  • estándar-1.1.2.jar

Esto choca. Retire el standard-1.1.2.jar. Debe usar standard-1.1.2.jarsolo con jstl-1.1.2.jar. Desde JSTL 1.2, el JAR estándar se ha fusionado en JSTL JAR, lo que da como resultado un único archivo jstl-1.2.jar.

+0

Buena para saber, gracias! Sin embargo, después de este cambio, el problema persiste. –

+0

Asegúrese de no haber extraído ningún archivo JSTL JAR e incluido en cada uno de sus archivos TLD en el classpath o definido nada en 'web.xml'. También asegúrese de no haber colocado/duplicado el archivo JSTL JAR en otro lugar, p. en 'Appserver/lib' o' JRE/lib'. Para instalar JSTL, básicamente, todo lo que necesita hacer es colocar el archivo JAR en classpath (por ejemplo, '/ WEB-INF/lib') y declarar el taglib en la parte superior del archivo JSP. Eso debería ser. Realmente no se necesita hacer nada más, de lo contrario colisionará en algún lugar. – BalusC

0

En su web.xml, intente cambiar "h77p: //java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" que comienzan con "http: //" para ver si consigue arregla el error

Sin embargo, eso no puede ser la causa subyacente, ya que tenía el mismo error al utilizar el embarcadero-maven-plugin y cabecera taglib JSTL en mi JSP:

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

PWC6188: El URI absoluta: http://java.sun.com/jsp/jstl/core no se puede resolver, ya sea en web.xml o los archivos jar desplegados con esta aplicación

que estoy usando una toma de de la caja Spring MVC plantilla de SpringSource Tool Suite, así que no estoy seguro de por qué el complemento Maven de Jetty se ahoga en él.

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

Y sólo javax.servlet: jstl: 1.2 aparece en las dependencias de mi POM, ya que ahora obsoleto taglibs: estándar: 1.1.2, que era una sugerencia dada anteriormente.

8

Jetty 8.0, que se ha presionado como el predeterminado cuando utiliza embarcadero: ejecutar, tiene servlet API 3.0. A partir de esa versión de la norma, se supone que debe incluirse el estándar JSTL, y estos taglibs no pueden estar en la ruta de clase de la aplicación web, solo la ruta de clase estándar. Sin embargo, 8.0.0.M0 olvidó incluirlos.

La especificación de 7.1.4.v20100610 me ayudó.

+0

Esta solución funcionó también para mí, pero me gustaría saber cuál es el verdadero problema. Con jetty 8.x no tuve problemas para ejecutar "mvn jetty: run", pero "java -jar target/dependency/jetty-runner.jar target/*. War" no funcionaría (que es lo que necesitaba para ejecutar mi aplicación web) en heroku). Cuando cambié a 7.x todo parecía unirse mágicamente. – kburns

+0

Fue (solo) un error en 8.0M0. – bmargulies

3

@Drew Gracias Drew. Se works.I había estado buscando en Google para esto y terminan here.What mi error fue: que estaba usando

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

He cambiado de arriba a

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

y se puso a trabajar. También estaba usando la dependencia de jstls que eliminé.

8

Los jstl taglibs deben estar en el servidor classpath. Puede agregar un cargador de clases a la cadena actual del cargador de clases antes de iniciar el servidor. Ese es el principio utilizado por start.jar cuando se inicia un servidor embarcadero.

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

También debe agregarlo al argumento de la línea de comandos de inicio de Java.

+0

+1 Para * una solución *: esta pregunta repite algo así como 10 veces en SO y todas las soluciones sugeridas (agreguen explícitamente jstl JAR al META-INF \ MANIFEST.MF, eliminan JAR de servlets que colisionan, etc.) simplemente no funcionan. Gracias Arsouille! –

0

También tuve los mismos problemas. Lo arreglé agregando el siguiente código:

public static final String[] TLD_JAR_NAMES = new String[]{"sitemesh", "spring-webmvc", "shiro-web", "springside-core"}; 
... 
JettyFactory.setTldJarNames(server, TLD_JAR_NAMES); 

Quizás puedas probarlo. Por favor, reemplace TLD_JAR_NAMES con los nombres reales de TLD Jar.

2

que tiene el mismo problema en el embarcadero 7, Lo resuelto permitiendo embarcadero para buscar TLD:

lo hice mediante el establecimiento de un atributo en el contexto:

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

Consulte http://wiki.eclipse.org/Jetty/Howto/Configure_JSP#Using_JSTL_Taglibs_for_Jetty_7.x_and_8.x para más detalles.

En mi proyecto (usando maven), tengo TLD estándar en el JAR "org.apache.taglibs.standard".glassfish-1.2.0.v2011120803.jar" y, teóricamente, sería suficiente para utilizar como valor por ContainerIncludeJarPattern el siguiente patrón:

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

En realidad funciona y es una confirmación de amarre donde no encontró las librerías de etiquetas, pero yo he preferido dejar el patrón anterior, que he encontrado en la página wiki.eclipse.org vinculado anteriormente.

puede ser requerido para extender el patrón si desea incluir librerías de etiquetas personalizadas.

2

I tuvo el mismo problema y descubrió que http://java.sun.com/jsp/jstl/core se considera como el URI de un solo sistema y todas las definiciones taglib t Si intentamos definirlo, se ignoran (pero cuando se hace referencia a ellos, se produce un error de todos modos).

que utilizó la siguiente antes de comenzar el embarcadero y ahora funciona:

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

Como en el nombre de Hades ... esto lo hizo, solucionó mi problema. ¡Gracias! –

+0

muchas gracias – littlejedi

+0

De nada. Es bueno poder devolver ... :) – Daniel

0

Al añadir el siguiente código que se deshizo del problema:

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

estoy usando embarcadero-corredor 8 .

1

dos etapas:

1) añadir soporte para el servidor de anotación

// Habilitar el análisis de las partes relacionadas con JNDI de web.xml y embarcadero-env.xml, #server es

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) añadir el atributo de seguimiento a la WebAppContext

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