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

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:

RequisitEnllaç de Descàrrega
JavaDescarregar Java
MavenDescarregar Maven
Docker DesktopDescarregar Docker Desktop
IntelliJ IDEA CommunityDescarregar IntelliJ IDEA Community

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:

  • .env per al desenvolupament
  • .env.test per a les proves
  • .env.staging per a la preproducció
  • .env.prod per 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=8080

Informació 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:

pom.xml
<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}.

compose.yaml
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: bridge

Informació Addicional

Opcions de docker-compose.yml

  • services: Defineix els serveis que s’executaran. En aquest cas, s’executaran dos serveis: app i db.
  • 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:

pom.xml
<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=1000 Les fonts utilitzades per a aquest apartat són:

Fil d’Intellij

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