falling - spring boot yaml profiles
Spring boot application.properties maven proyectos de varios módulos (4)
Estamos utilizando el arranque de primavera en un proyecto de varios módulos.
Tenemos un módulo de acceso de Dominio que tiene las clases de objetos de dominio comunes, repositorios, junto con la configuración para el origen de datos, JPA, Hibernate, etc. Estos se configuran utilizando un application.properties. Ponemos toda esta configuración en el módulo común para ahorrar la duplicación de estas configuraciones comunes en los módulos de nivel superior.
Todo esto funciona bien al construir el módulo de dominio, por lo que las configuraciones se cargan correctamente en las unidades de prueba.
Sin embargo, los problemas comienzan cuando tratamos de usar el módulo de dominio en los módulos de capa superior; tienen sus propias propiedades de aplicación, lo que significa que Spring las carga y no el módulo de dominio application.properties, lo que significa que el origen de datos no está configurado porque solo se carga el módulo superior application.properties.
Lo que nos gustaría es que tanto el módulo de dominio como las propiedades de la aplicación de nivel superior sean cargadas por Spring. Pero no podemos ver ninguna manera fácil de hacer esto.
Estoy pensando que esto debe ser un problema común, y me pregunto si hay alguna solución recomendada para este problema.
Como usamos Spring-boot, la solución idealmente debería usar anotaciones en lugar de applictionContext.xml.
Estoy de acuerdo con @Dave Syer. La idea de dividir una aplicación en múltiples módulos es que cada uno de ellos es una unidad independiente, en este caso un archivo jar. Teóricamente, podría dividir cada uno de esos archivos jar en sus propios repositorios de origen y luego usarlos en múltiples proyectos. Supongamos que desea volver a utilizar estas clases de dominio tanto en una aplicación web como en una aplicación por lotes, si toda la configuración del nivel APLICACIÓN se almacena dentro de cada uno de los módulos, esto reduce drásticamente su capacidad de reutilización.
IMO solo el módulo de agregación debe contener toda la configuración necesaria para ejecutarse como una aplicación, todo lo demás es simplemente una dependencia que puede remezclarse y reutilizarse según sea necesario.
Otra cosa que puedes hacer (además de usar solo application.properties en el nivel superior como menciona Dave Syer) es nombrar el archivo de propiedades del módulo de dominio algo así como domainConfig.properties
.
De esta forma evitarás el nombre colisión con application.properties
.
domainConfig.properties
contendría todos los datos necesarios para que el módulo de dominio pueda ser probado por sí mismo. La integración con el resto del código se puede hacer fácilmente usando @PropertySource
múltiple (uno para domainConfig.properties
y otro para application.properties
) o configurando un bean PropertySourcesPlaceholderConfigurer
en su JavaConfigura (consulte this tutorial) que hace referencia a todas las archivos de propiedad necesarios
Tal vez otro enfoque podría ser definir perfiles específicos para cada módulo y usar el archivo application.properties solo para especificar que los perfiles de bruja estén activos usando la propiedad spring.profiles.include .
domain-module
- application.properties
- application-domain.properties
app-module
- application.properties
- application-app.properties
y en el archivo application.properties del módulo de la aplicación
spring.profiles.include=domain,app
¿Tal vez solo deberías usar application.properties
en el proyecto de agregación de nivel superior?
Siempre puede usar @PropertySource
en los proyectos secundarios para configurarlos con un nombre que sea específico para su caso de uso.
O puede usar diferentes nombres para cada proyecto y spring.config.location
en el proyecto de nivel superior utilizando spring.config.location
(separados por comas).