· Jose Antonio López · 5 min lectura
Configurar un Projecte Spring Boot per al Desenvolupament
Com configurar un projecte Spring Boot amb docker-compose, PostgreSQL i Spring Boot Developer tools.

Objectiu
Explicar com configurar un projecte Spring Boot 3.3.5 que utilitza docker-compose, PostgreSQL i Spring Boot Developer tools.
Per què escric aquest article?
Sovint, la informació està dispersa i no en un sol lloc. A més, la informació pot estar desactualitzada o tan enrevessada que et desanima a fer millores. La meva experiència em diu que en el cas de Spring, tota la informació hi és, però no en un sol lloc. A més, moltes vegades no queda clar què estan dient.
Aquest article és una guia per tenir tota la informació en un sol lloc perquè puguis configurar el teu projecte Spring Boot en un entorn de desenvolupament.
Prerequisits
Per seguir aquest article, necessites tenir instal·lat:
DotEnv
Propòsit
Utilitzar un fitxer .env serveix per desacoblar la configuració de l’aplicació. S’utilitza per tenir dades que depenen de l’entorn on s’executa l’aplicació. Tot això és sensible als canvis i no hauria d’estar en el codi font.
Pots tenir tants fitxers com entorns tinguis:
.envper al desenvolupament.env.testper a les proves.env.stagingper a la preproducció.env.prodper a la producció
Si desplegues en un entorn de producció, has d’assegurar-te que les variables d’entorn estan al servidor, ja sigui intern o al núvol.
Els noms dels fitxers són arbitraris i depèn de l’equip de desenvolupament decidir com anomenar-los. No perdis massa temps debatent. L’important és que s’entengui.
Configuració
Crea un fitxer .env a l’arrel del projecte. El fitxer conté les variables d’entorn que s’utilitzaran en el projecte.
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=8080Informació Addicional
Quan trobes una sintaxi com ${POSTGRES_USER}, és perquè s’està referenciant una variable. En aquest cas, es refereix a la variable POSTGRES_USER. El nom tècnic d’aquesta sintaxi és interpolació.
Docker Compose
Propòsit
Docker Compose és una eina que et permet definir i executar aplicacions Docker amb més d’un contenidor. Docker Compose facilita la definició de la configuració per als contenidors. En lloc d’utilitzar docker run per a cada contenidor i passar un munt de paràmetres, defineixes un fitxer docker-compose.yml i executes docker-compose up.
Configuració
Afegeix la següent dependència:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>Crea un fitxer compose.yaml a l’arrel del projecte. Aquest fitxer contindrà les variables d’entorn que s’utilitzaran en el projecte. Les variables d’entorn es referencien amb la sintaxi ${VARIABLE}.
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ó Addicional
Opcions de docker-compose.yml
services: Defineix els serveis que s’executaran. En aquest cas, s’executaran dos serveis:appidb.networks: Defineix la xarxa que s’utilitzarà. En aquest cas, s’utilitza la xarxa crm-network.depends_on: Defineix la dependència entre serveis. El servei app esperarà que db estigui saludable.healthcheck: S’executa una comanda per veure si la base de dades està llesta.network: El tipus bridge és el predeterminat i el més comú.
Si vols saber més sobre els tipus de drivers, pots visitar la documentació oficial sobre drivers. Si vols saber més sobre Docker Compose, pots visitar la documentació oficial de Docker.
Com funciona?
Spring Boot té suport per a Docker Compose. Quan detecta un fitxer docker-compose.yml a l’arrel del projecte, inicia els contenidors Docker utilitzant la comanda docker-compose up.
Si troba un contenidor que ja està en execució, Spring Boot no el reinicia i el salta.
El que normalment faig és iniciar manualment el contenidor de PostgreSQL des d’IntelliJ i després iniciar l’aplicació Spring Boot també des d’IntelliJ.
Per a més informació sobre el suport de Docker Compose a Spring Boot, pots visitar la documentació oficial de Spring Boot.
Eines de Desenvolupament
Propòsit
Quan programes localment i fas canvis, has d’aturar l’aplicació, executar la comanda mvn clean install i reiniciar l’aplicació. Aquest és un procés repetitiu i lent.
Les Eines de Desenvolupament de Spring Boot permeten que l’aplicació es reiniciï automàticament quan es detecten canvis en el codi font.
Configuració
Afegeix la següent dependència:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>3.4.1</version>
<scope>runtime</scope>
<optional>true</optional>
</dependency>Informació Addicional
Les Eines de Desenvolupament no s’han de carregar en producció. Només es carreguen en entorns de desenvolupament. Per tant, la dependència té l’abast establert a runtime i optional. Hi ha maneres més avançades de controlar les Eines de Desenvolupament.
Com funciona?
El reinici de l’aplicació Spring Boot utilitza dos classloaders. Les classes que no canvien, com les biblioteques de tercers, es carreguen en un classloader base. Les classes que desenvolupes es carreguen en un restart classloader. Quan l’aplicació es reinicia, el restart classloader es descarta i se’n crea un de nou. Els reinicis de l’aplicació seran molt més ràpids que els “iniciaments en fred”.
Si vols saber més, pots visitar la documentació oficial.
Configurant IntelliJ
Propòsit
Configura IntelliJ per executar l’aplicació amb Docker Compose i Eines de Desenvolupament. Si et funciona ràpidament, pots saltar aquesta configuració. En el meu cas, no va funcionar a la primera i va trigar gairebé 10 segons a reiniciar-se.
Configuració
Si vols que l’IDE guardi els teus canvis i comenci la compilació automàticament amb qualsevol modificació, has d’anar a:
- Estableix el valor a 1 segon
Settings | Appearance & Behavior | System Settings | Save files if the IDE is idle for - Marca la casella
Settings | Build, Execution, Deployment | Compiler | Build project automatically - Marca la casella
Settings | Advanced Settings | Allow auto-make to start even if developed application is currently running - Ves a Help | Find Action | Registry i estableix
compiler.automake.postpone.when.idle.less.than=1000Les fonts utilitzades per a aquest apartat són:
Propers passos
Un cop configurat l’entorn de desenvolupament, el següent pas és triar les llibreries adequades per al teu projecte. Pots consultar la guia de dependències clau a Spring Boot per saber per on començar.
- Docker
- Spring Boot