Dev Services: entornos de desarrollo automáticos en Quarkus

Te sumas a un nuevo proyecto. Clonas el repositorio. Y ahora… ¿qué? ¿Qué versión de PostgreSQL necesito? ¿Me pasas las credenciales de la base de datos local? Suena familiar, ¿verdad? Configurar el entorno de desarrollo suele ser el primer obstáculo para cualquier desarrollador nuevo en un proyecto. Pero en Quarkus, Dev Services elimina ese problema.


¿Qué es Dev Services?

Es una funcionalidad de Quarkus que levanta automáticamente los servicios externos que tu aplicación necesita: bases de datos, brokers de mensajería, cachés, etc.

La idea es simple: si tu aplicación necesita PostgreSQL y no configuraste una conexión, Quarkus asume que estás desarrollando y levanta un contenedor por ti.

Clonas, ejecutas quarkus dev, y funciona.


¿Cómo funciona?

Cuando agregas una extensión compatible (como jdbc-postgresql), Quarkus:

  1. Detecta que no hay conexión configurada
  2. Levanta un contenedor con el servicio
  3. Configura automáticamente la conexión
  4. Ejecuta tus scripts de inicialización (si existen)

Todo ocurre de forma transparente. No escribes configuración de conexión.


En este tutorial

Vamos a crear una aplicación simple con PostgreSQL para ver Dev Services en acción. Elegimos PostgreSQL porque es muy común, pero Dev Services funciona igual con MySQL, MongoDB, Redis, Kafka y muchos otros servicios.

Al final tendrás un proyecto que cualquier compañero puede clonar y ejecutar sin configurar nada.


Requisitos

  • Java 17 ó 21 (soportadas por Quarkus)
  • Maven 3.9 o superior
  • Podman o Docker funcionando
  • Quarkus CLI

¿No cumples todos los requisitos? Revisa Entorno de desarrollo ideal para Quarkus donde explicamos cómo instalar todo fácilmente.

Si usas Podman, te sugerimos revisar Usando Podman con Quarkus: la configuración esencial


Crear el proyecto

quarkus create app io.quarkiverso:dev-services-tareas \
  --extension=rest-jackson,jdbc-postgresql,hibernate-orm-panache

Esto crea un proyecto con:

  • REST Jackson: para exponer endpoints REST
  • JDBC PostgreSQL: el driver de PostgreSQL (activa Dev Services)
  • Hibernate ORM Panache: acceso simplificado a la base de datos

Entra al proyecto:

cd dev-services-tareas

Crear la entidad

Crea el archivo src/main/java/io/quarkiverso/Tarea.java:

package io.quarkiverso;

import io.quarkus.hibernate.orm.panache.PanacheEntity;
import jakarta.persistence.Entity;

@Entity
public class Tarea extends PanacheEntity {
    public String titulo;
    public boolean completada;
}

Con Panache, PanacheEntity proporciona automáticamente el campo id y métodos como listAll()findById(), etc.


Crear el endpoint

Crea el archivo src/main/java/io/quarkiverso/TareaResource.java:

package io.quarkiverso;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import java.util.List;

@Path("/tareas")
public class TareaResource {

    @GET
    public List<Tarea> listar() {
        return Tarea.listAll();
    }
}

Inicializar la base de datos

Aquí está la magia. Crea el archivo src/main/resources/import.sql:

INSERT INTO Tarea (id, titulo, completada) VALUES (1, 'Aprender Quarkus', false);
INSERT INTO Tarea (id, titulo, completada) VALUES (2, 'Configurar Dev Services', true);
INSERT INTO Tarea (id, titulo, completada) VALUES (3, 'Subir el proyecto a Git', false);

Quarkus ejecuta automáticamente este archivo cuando Hibernate crea las tablas.


Configurar la aplicación

Edita src/main/resources/application.properties:

# Hibernate crea las tablas automáticamente
%dev.quarkus.hibernate-orm.database.generation=drop-and-create

El prefijo %dev hace que esta configuración solo aplique cuando ejecutas en modo desarrollo (quarkus dev). En producción, estas líneas se ignoran y debes configurar la conexión manualmente.

Eso es todo. No hay URL de conexión, ni usuario, ni contraseña. Dev Services se encarga.


Ejecutar

quarkus dev

Observa la consola. Verás algo como:

Dev Services for PostgreSQL started

Quarkus levantó un contenedor de PostgreSQL automáticamente.


Probar

En otra terminal (o en tu navegador):

curl http://localhost:8080/tareas

Respuesta:

[
  {"id":1,"titulo":"Aprender Quarkus","completada":false},
  {"id":2,"titulo":"Configurar Dev Services","completada":true},
  {"id":3,"titulo":"Subir el proyecto a Git","completada":false}
]

Los datos del import.sql ya están ahí.


¿Qué pasó detrás?

  1. Quarkus detectó quarkus-jdbc-postgresql sin configuración de conexión
  2. Levantó un contenedor PostgreSQL usando Testcontainers
  3. Configuró automáticamente quarkus.datasource.jdbc.urlusername y password
  4. Hibernate creó la tabla Tarea
  5. Ejecutó import.sql para insertar los datos

Todo sin que escribieras una sola línea de configuración de conexión.


La experiencia del nuevo desarrollador

Cuando alguien se une al proyecto:

git clone https://github.com/quarkiverso/dev-services-tareas.git
cd dev-services-tareas
quarkus dev

Y listo. Base de datos funcionando con datos de prueba. Sin instalar nada adicional (asumiendo que tiene Podman/Docker).

Esto elimina el clásico problema de «en mi máquina funciona» para el entorno de desarrollo.