Desarrollando ServicioWeb con SpringBoot en Tomcat con formato '.war'
SpringBoot Spring Framework Backend

Desarrollando ServicioWeb con SpringBoot en Tomcat con formato '.war'

Silverio Martínez García
Silverio Martínez García

Esta entrada del blog es antigua y su contenido actualmente solo es útil si ya tienes un proyecto SpringBoot desarrollado y quieres desplegarlo en Tomcat como un archivo '.war'.
Si por el contrario tienes pensado desarrollar un nuevo proyecto con SpringBoot vete directamente al final del post donde se indica como hacerlo de forma más fácil y directa.

En una entrada anterior hemos visto como utilizar la Inyección de Dependencias en Spring y como crear un Servicio Web Rest para desplegarlo en Tomcat. En este artículo vamos a intentar avanzar un poco más y utilizar toda la comodidad y ventajas que aporta SpringBoot.

SpringBoot está pensado para comenzar un proyecto sin tener que realizar toda la configuración manualmente. Nos ahorra el trabajo de tener que escribir (o copiar pegar XD)todas las librerías que hacen falta en el archivo 'pom.xml' y los quebraderos de cabeza que se originan cuando existen conflictos de versiones entre ellas.
Y si ya era una ventaja la configuración de Spring por medio de las clases 'JavaConfig' (en vez de utilizar los obsoletos archivos .xml), ahora casi todo el trabajo lo hace Spring por nosotros a partir de un archivo 'application.properties' donde podremos especificar todos los parámetros necesarios para dicha configuración de una forma clara, sencilla y centralizada.

Creando nuestro proyecto SpringBoot con SpringInitializer:

La manera más rápida de crear un proyecto SpringBoot es por medio del sitio web Spring Initializr.
Este sitio web está pensado para crear nuestro proyecto indicando todo lo que vamos a necesitar durante el desarrollo.
En este caso utilizaremos SpringBoot v2.1.2 e indicaremos que vamos a utilizar las dependencias para Web, JPA y PostGreSQL como se puede ver en la siguiente imagen:

Spring Initializr (old version)

Pulsando en el botón 'Generate' se inicia la descarga de nuestro proyecto en formato '.zip'. Si descomprimimos el archivo y abrimos el 'pom.xml' podemos ver como SpringInitializer ya ha añadido automáticamente las dependencias de SpringBoot según nuestras necesidades.

Nuestro 'pom.xml' hereda del artifact 'spring-boot-starter-parent' el cual ya agrega por nosotros todas las librerías necesarias para arrancar un ServicioWeb REST con Spring.
Además vemos como al indicar que utilizaríamos 'JPA' nos ha añadido el artifact 'spring-boot-starter-data-jpa' que a su vez incluye todas las dendencias para utilizar los Repositorios y Entidades con Spring JPA y asegurándonos que la versión de todas las librerías son compatibles entre ellas para la versión '2.1.2' de SpringBoot.
Lo mismo ha hecho con las liberías para utilizar nuestra B.D. PostgreSQL.

Configuración del 'pom.xlm' para desplegar en Tomcat:

Por defecto, un proyecto SpringBoot está pensado para ejecutarse por si mismo de forma 'standalone', es decir, el propio proyecto se ejecuta como un servicio escuchando las peticiones en un puerto determinado.
El archivo '.jar' de nuestro servicio se autoarranca a si mismo haciendo uso de un servidor tomcat embebido, al contrario que cuando desarrollábamos un Servicio Web con Spring MVC sin SpringBoot, que se generaba un archivo '.war' que había que desplegar de forma manual en un servidor Tomcat previamente instalado en nuestro sistema.
Esto es así porque SpringBoot está orientado al desarrollo de 'MicroServicios'.

Aquí te dejo un enlace a un artículo donde se explica como arrancar un proyecto SpringBoot en formato standalone.

En nuestro caso, vamos a realizar el despliegue de nuestro servicio SpringBoot en un servidor 'Tomcat', que es un servidor de aplicaciones (servlets o archivos .war) que gestiona todas las peticiones a nuestros servicios web desplegados en él por un mismo puerto. Además nos ofrece la posibilidad de gestionar nuestros servicios web (arrancarlos, pararlos, estadísticas, logs...).

Para ello lo único que hace falta es añadir en nuestro archivo pom.xml el tipo de empaquetado (en vez de .'jar' será un '.war') y añadir la correspondiente dependencia:

Además, para que SpringBoot sepa que debe desplegar el proyecto en Tomcat, debemos de crear nuestra clase de configuración que herede de SpringBootServletInitializer.

Desplegando nuestro proyecto en Tomcat:

Con esto nuestro proyecto está listo para ejecutarse y deslegarse en Tomcat.
En tiempo de desarrollo, dependendiendo del IDE que utilicemos, habrá que configurarlo para que cuando ejecutemos el proyecto, nuestro IDE arranque una instacia de Tomcat escuchando en un puerto determinado y despliegue automáticamente nuestro servicio web en él. Una vez que finalicemos la ejecución del proyecto, nuestro IDE también será el encargado de destruir la instacia del servicio Tomcat.

En producción, una vez generado el archivo '.war' de nuestro proyecto, habrá que copiarlo en la carpeta 'webapps' de nuestro Tomcat. Teniendo en cuenta que el nombre que le demos al archivo determinará el inicio de la 'url' para las peticiones REST, ya que es la única forma en la que Tomcat puede diferenciar a que servicio web pertenece cada llamada entrante.


Actualización Entrada:

Cuando escribí esta entrada del blog la página de Spring Initializr. tenía muchas menos opciones que hoy en día.

La versión actual permite seleccionar el tipo de 'packaging' de nuestro proyecto (jar ó war).
Con lo cual escogiendo 'war' la plantilla de proyecto creada ya incluye todos los pasos explicados en esta entrada :) y no haría falta hacer nada más.

Dejo publicada la entrada por si alguien tiene un proyecto de SpringBoot ya desarrollado y necesita hacer los cambios a mano, pero para proyectos nuevos, cambiando el tipo de packaging a 'war' en la web de Spring Initializr. es sufienciente.

Spring Initializr

Esto es todo de momento amigos :)
A tope codear!!!