Mi primera TagLib

Hace ya unos meses me puse con Tomcat, jsp, servlets y demás. Empecé con varios ejemplos simples para ir aprendiendo

  • Instalación de Tomcat, cosa muy tonta en windows, porque basta con ejecutar un ejecutable de instalación.
  • Una página jsp estúpida, en plan "hola mundo".
  • Un jsp con algo más de código, para consultar una base de datos y escribir una tabla en el navegador.
  • Otra vez lo mismo, pero separando el código java en clases separadas fuera de la página jsp.
  • Un proyecto con servlet creado con maven.
  • y finalmente, intenté hacerme un tag de taglib tonto, para escribir "hola mundo" en pantalla.

Pues bien, fui poniendo todos estos ejemplos en una categoría j2ee/jsp de la Chuwiki salvo el último. Por más que miraba tutoriales, hacía pruebas y cambiaba cosas, no conseguía hacer funcionar un simple taglib con <hola:holamundo/>. Al mostrarlo en el navegador, siempre me salía un error 500 del servidor y la traza del error no me decía nada de nada.

Después de varios días de intentos sin resultados, acabé dejando el tema durante casi tres meses, pero sin el casi. Anteayer, por fin, retomé el tema y me puse nuevamente a ello. Por fin acabé encontrando el problema y escribiendo el ejemplo de taglib en la Chuwiki. Paso a detallar el problema, por si a alguien le pasa lo mismo.

Maven me parece una maravilla. Con maven se puede crear un proyecto web que genere automáticamente el war para desplegar en Tomcat. Así que mis ejemplos los hice con maven. Con el comando maven

mvn archetype:create
   -DgroupId=chuidiang.ejemplos
   -DartifactId=TagLib
   -DarchetypeArtifactId=maven-archetype-webapp

me crea la estructura del proyecto, con el webapp y los huecos para escribir mi código java, páginas jsp, etc. Ahí me  puse a ello.

La clase java que hace de TagLib debe heredar de TagSupport, una clase de la api de jsp/servlet, así que en el fichero pom.xml de maven pongo alegremente esa dependencia. Todo aparentemente sin problemas. Hago todo lo que tengo que hacer -clases, fichero tld, fichero web.xml, etc- y luego con un mvn install genero el fichero war. Me llevo el fichero war a Tomcat, se despliega correctamente … y no funciona. Error http 500.

Empiezo a quitar poco a poco cosas, para ver dónde está el fallo. Al final llego a un proyecto tonto, con un único fichero index.jsp que pone "hola mundo" sin taglib ni nada…. y tampoco funciona, sigue con error http 500.

Al final, desesperado, quito del pom.xml la dependencia con el jar de la api de jsp …. y funciona bien.

Resulta que maven, al poner la dependencia con esa api de jsp para el compilado de las clases, mete el jar de dicha api dentro del proyecto, en WEB-INF/lib. Pues bien, se ve que esa versión de api -la última de que dispone maven en sus repositorios-, es la 2.1, que debe ser incompatible con la que utiliza el Tomcat más moderno.

Buscando en la página de maven, encuentro que se puede configurar para que no incluya algunos jar dentro del WEB-INF/lib, Por cierto, a lo que pone ese enlace, en la configuración del plugin, tuve que cambiar el <addClassPath> por false -en el ejemplo pone true-. Luego, en la dependencia en el pom.xml del jar de la api de jsp, en vez de <scope>compile, puse <scope>provided. Mano de santo, eso genera mi war sin meter dentro del jar de la api de jsp y funciona todo como debe.

Las herramientas automáticas son una maravilla, pero si no se entienden bien, pasan estas cosas. Hacen muchas cosas y si hacen alguna mal o no la hacen como tu quieres, o las entiendes bien o lo llevas claro.

 
Esta entrada fue publicada en java, maven, web. Guarda el enlace permanente.

Una respuesta en “Mi primera TagLib

  1. Blaxter dijo:

    Maven entre el amor y el odio. Cuando funciona bien ni te das cuenta, puesto que funciona. Pero cuando falla por causas estúpidas similares a esta te vuelves loco y lo odias a muerte, para luego volver a pasar a la fase anterior… cosas curiosas cuanto menos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.