· Jose Antonio López · 5 min lectura
Configurar un proyecto Spring Boot para desarrollo
Cómo configurar un proyecto de Spring Boot con docker-compose, PostgreSQL y las Developer tools de Spring Boot.

Objetivo
Explicar cómo se configura un proyecto de Spring Boot 3.3.5 que usa docker-compose, PostgreSQL y las Developer tools de Spring Boot.
¿Porque escribo este artículo?
Muchas veces la información está dispersa y no está en un solo lugar. Además, la información puede estar desactualizada o que sea tan rebuscada que hace que no apliques mejoras.
Mi experiencia me dice que en el caso de Spring toda la información está ahí pero no está en un solo lugar. Además muchas veces tampoco se entiende qué dicen.
Este artículo es una guía para tener toda la información en un solo lugar y que puedas configurar tu proyecto de Spring Boot en un entorno de desarrollo.
Prerequisitos
Para seguir este artículo necesitas tener instalado:
DotEnv
Propósito
Usar un archivo .env sirve para desacoplar la configuración de la aplicación. Se usa para tener datos que dependen del entorno donde se ejecuta la aplicación. Todo esto es sensible a cambios y no debe estar en el código fuente.
Puedes tener tantos archivos como entornos tengas:
.envpara desarrollo.env.testpara pruebas.env.stagingpara preproducción.env.prodpara producción
Si desplegas en un entorno de producción, debes tener en cuenta que las variables de entorno deben estar en el servidor ya sea in-house o en la nube.
Los nombres de los ficheros son arbitrarios y es decisión del equipo de desarrollo decidir cómo se llaman. Tampoco os paséis mucho tiempo debatiendo. Lo importante es que se entienda.
Configuración
Crea un archivo .env en la raíz del proyecto. El archivo contiene las variables de entorno que se usarán en el proyecto.
APPLICATION_NAME=crm
POSTGRES_DB=crm
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_HOST=db
POSTGRES_PORT=5432
SPRING_DATASOURCE_URL=jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
SPRING_DATASOURCE_USERNAME=${POSTGRES_USER}
SPRING_DATASOURCE_PASSWORD=${POSTGRES_PASSWORD}
SPRING_PORT=8080
Información adicional
Cuando te encuentras una sintaxis tipo ${POSTGRES_USER} es porque se está referenciando a una variable. En este caso, se hace referencia a la variable POSTGRES_USER. El nombre técnico para esta sintaxis se llama interpolación.
Docker Compose
Propósito
Docker Compose es una herramienta que permite definir y ejecutar aplicaciones Docker con más de 1 contenedor. En vez de usar docker run para cada contenedor y pasar un montón de parámetros, se define un archivo docker-compose.yml y se ejecuta docker-compose up.
Configuración
Añade la siguiente dependencia:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>Crea un archivo compose.yaml en la raíz del proyecto. El archivo contendrá las variables de entorno que se usarán en el proyecto. Las variables de entorno se referencian con la sintaxis ${VARIABLE}.
Es la misma estrategia y sintaxis que en el archivo .env.
services:
app:
build: .
ports:
- ${SPRING_PORT}:${SPRING_PORT}
container_name: crm-app
networks:
- crm-network
depends_on:
db:
condition: service_healthy
environment:
SPRING_DATASOURCE_URL: ${SPRING_DATASOURCE_URL}
SPRING_DATASOURCE_USERNAME: ${SPRING_DATASOURCE_USERNAME}
SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD}
db:
image: postgres:alpine
ports:
- ${POSTGRES_PORT}:${POSTGRES_PORT}
container_name: postgres
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
networks:
- crm-network
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U postgres']
interval: 5s
timeout: 20s
retries: 3
networks:
crm-network:
driver: bridgeInformación adicional
Opciones del docker-compose.yml
services: Define los servicios que se ejecutarán. En este caso, se ejecutarán dos servicios:appydb.networks: Define la red que se usará. En este caso, se usa la red crm-network.depends_on: Define la dependencia entre los servicios. El servicio app esperará a que db este sano.healthcheck: Se lanza un comando para ver si la base de datos está lista.network: El tipo bridge viene por defecto y es el más común.
Si quieres saber más sobre tipos de drivers, puedes visitar la documentación oficial sobre drivers. Si quieres saber más sobre Docker Compose, puedes visitar la documentación oficial de Docker.
¿Cómo funciona?
Spring Boot tiene soporte para Docker Compose. Cuando detecta que hay un archivo docker-compose.yml en la raíz del proyecto, arranca los contenedores de Docker mediante el comando docker-compose up.
Si encuentra un contenedor que ya está en ejecución, Spring Boot no lo reinicia y pasa de largo.
Lo que yo suelo hacer es arrancar manualmente el conteneder de PostgreSQL desde IntelliJ y luego arranco la aplicación de Spring Boot también desde IntelliJ.
Para más información sobre el soporte de Docker Compose en Spring Boot, puedes visitar la documentación oficial de Spring Boot.
Developer Tools
Propósito
Cuando estás programando en local y haces cambios, tienes que parar la aplicación, ejecutar el comando mvn clean install y volver a arrancar la aplicación. Esto es un proceso repetitivo y lento.
Las Developer Tools de Spring Boot permiten que la aplicación se reinicie automáticamente cuando se detectan cambios en el código fuente.
Configuración
Añade la siguiente dependencia:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>3.4.1</version>
<scope>runtime</scope>
<optional>true</optional>
</dependency>Información adicional
Las Developer Tools no se deben cargar en producción. Solo se cargan en entornos de desarrollo. Por eso, la dependencia tiene el scope en runtime y optional.
¿Cómo funciona?
El restart de la aplicación de Spring Boot usa dos classloaders. Las clases que no cambian como las librerías de terceros se cargan en un classloader de clases base. Las clases que desarrollas se cargan en un cargador de clases restart.
Cuando la aplicación se reinicia, el cargador de clases restart se elimina y se crea uno nuevo. Los reinicios de la aplicación serán mucho más rápidos que los “arranques en frío”.
Si quieres saber más, puedes visitar la documentación oficial.
Configurar IntelliJ
Propósito
Configurar IntelliJ para que se ejecute la aplicación con Docker Compose y las Developer Tools. Si te funciona de forma rápida puedes prescindir de esta configuración. En mi caso, no me funcionó a la primera y tardaba casi 10 segundos en hacer el restart.
Configuración
Si deseas que el IDE guarde tus cambios y comience la compilación automáticamente con cualquier modificación debes ir a:
Settings | Appearance & Behavior | System Settings | Save files if the IDE is idle for—> Establecer el valor a 1 segundoSettings | Build, Execution, Deployment | Compiler | Build project automatically—> Activar la casillaSettings | Advanced Settings | Allow auto-make to start even if developed application is currently running—> Activar la casillaIr a Help | Find Action | Registry. Establecer el valor
compiler.automake.postpone.when.idle.less.than=1000
Las fuentes usadas para este apartado son:
Siguientes pasos
Una vez configurado el entorno de desarrollo, el siguiente paso es elegir las librerías adecuadas para tu proyecto. Puedes consultar la guía de dependencias clave en Spring Boot para saber por dónde empezar.
- Docker
- Spring Boot