BOM (Bill Of Materials) - nelsonortfan/MicroDockerSpringBoot GitHub Wiki
Esta opción se usa para administrar desde un archivo pom.xml centralizado todas las propiedades y versiones de las dependencias que son comunes entre todos los microservicios, así como los plugins y Tags usados para crear las imágenes Docker. Reduce el esfuerzo de actualizaciones y adicional evita conflictos de versiones entre microservicios.
Para su uso, creamos un proyecto desde la pagina de Spring Boot con las siguientes características pero sin ninguna dependencia a usar:
- Name: eazy-bom
- Language: Java
- Group: com.eazybytes
- Type: Maven
- Artifact: eazy-bom
- Package Name: com.eazybytes.eazybom
- Java: 21
- Packaging: jar
Una vez creado, eliminamos el folder src con todo su contenido ya que no vamos a tener ninguna codificación para este modulo.
Borramos la etiqueta y su contenido y la reemplazamos por lo siguiente:

Agregamos ahora en la propiedad los valores que serán comunes para los microservicios:

La primera propiedad es un modulo que crearemos mas tarde para tener código común centralizado.
Luego Agregamos la siguiente configuración de donde colocamos todas las dependencias que usan los microservicios:

En la opción de dejamos una dependencia que sea transversal a todos los microservicios, que es la de Spring test:

Abrimos ahora el archivo pom.xml de Accounts y modificamos la etiqueta para que quede de la siguiente manera, colocando como versión la misma que tiene el proyecto BOM:

En las de Accounts, lo que hacemos es cambiar la version explicita por la propiedad que nombramos en BOM:

Borramos del pom.xml de Accounts la configuración de ya que la heredara de BOM. Finalmente modificamos la versión del tag de la imagen usando las propiedades del BOM:

Repetir el mismo proceso que hicimos para Accounts para el resto de los microservicios.
Se recargan todos los proyectos con Maven. Procedemos a construir la imagen del servicio Config Server para ver que funciona todo correctamente y que no afecta el uso de BOM:

En Docker vemos la imagen creada exitosamente:

La ejecutamos:

Si se desea, en cada microservicio se puede colocar la versión explicita que queramos para que no herede de la definida en BOM.
Otro uso que se le da a BOM es tener código repetido centralizado como una librería común. En este caso tomaremos la clase ErrorResponseDto que se repite en los servicios Accounts, Cards y Loans. Para que esto sea posible, se usara un proyecto de Maven con varios módulos.
Creamos el siguiente proyecto en Spring Boot con las dependencias que necesita el código para trabajar:

Lo importamos a nuestro proyecto con los otros microservicios:

Lo movemos al proyecto Bom para que quede como un modulo:

En el archivo pom.xml de eazy-bom, lo agregamos como un modulo de esta manera:

En el archivo pom.xml de commons, modificamos el parent para que quede de la siguiente forma:

Eliminamos la clase principal de java y la clase principal de pruebas del proyecto de commons.
De ese mismo archivo pom.xml retiramos todo lo de plugins y adicional agregamos una nueva dependencia que nos ayudar con lo requerido para la clase que vamos a pasar:

Creamos un nuevo paquete dto y pegamos la clase ErrorResponseDto que queremos dejar centralizada:

Abrimos el archivo pom.xml de Accounts e importamos esta nueva librería en las dependencias:

Borramos la clase ErrorResponseDto de Accounts y hacemos las importaciones desde la libreria common en los Controllers y GlobalException donde es requerido:
Construir la imagen de Accounts:

Repetir el proceso para Cards y Loans.
Creamos las imágenes y ejecutamos el docker compose:

Todo funciona OK, salvo el servicio Accounts que arroja el siguiente error y por ende el servicio Gateway no puede iniciar:

Para arreglar este problema, en el servicio Accounts agregamos el parametro entre comillas para la anotacion @RequestParam de las interfaces de Feign:

Volvemos a ejecutar y esta vez funciona correctamente.
NOTA: La prueba debe hacerse con todos los microservicios funcionando con la sincronizacion de Docker Compose. Si se trata de crear una imagen de Accounts aislada sin conexión a ConfigServer por la red interna de Docker definida en Docker Compose, no encontrara las propiedades y fallara al ejecutarse. Incluso si solo trata de ejecutarse localmente:
