Подтвердить что ты не робот

Spring загрузочные приложения .properties maven мультимодульные проекты

Мы используем загрузку spring в многомодульном проекте.

У нас есть модуль доступа к домену, который имеет общие классы объектов домена, репозитории вместе с конфигурацией для источника данных, JPA, Hibernate и т.д. Они настроены с использованием application.properties. Мы помещаем всю эту конфигурацию в общий модуль, чтобы сохранить дублирование этих общих конфигураций в модулях более высокого уровня.

Все это прекрасно работает при создании модуля домена, поэтому конфигурации загружаются правильно в тестовых единицах.

Однако проблемы начинаются, когда мы пытаемся использовать модуль домена в модулях более высокого уровня; они имеют свои собственные application.properties, что означает, что spring загружает их, а не модуль домена domain.properties, что означает, что источник данных не настроен, потому что загружаются только более высокий модуль application.properties.

Мы хотели бы, чтобы как модуль домена, так и свойства приложения более высокого уровня загружались с помощью Spring. Но мы не видим никакого простого способа сделать это.

Я думаю, что это должна быть общая проблема, и интересно, есть ли какие-либо рекомендуемые решения для этой проблемы?

Поскольку мы используем spring -boot, в идеале решение должно идеально использовать аннотации вместо applictionContext.xml.

4b9b3361

Ответ 1

Я согласен с @Dave Syer. Идея разделения приложения на несколько модулей заключается в том, что каждый из них является независимым модулем, в данном случае файлом jar. Теоретически вы можете разбить каждый из этих файлов jar на свои собственные исходные репозитории, а затем использовать их для нескольких проектов. Предположим, вы хотите повторно использовать эти классы домена в веб-и пакетном приложении, если вся конфигурация уровня APPLICATION хранится в каждом из отдельных модулей, это значительно снижает их повторное использование.

IMO только агрегационный модуль должен содержать всю конфигурацию, необходимую для запуска в качестве приложения, а все остальное - просто зависимость, которая может быть повторно добавлена ​​и повторно использована по мере необходимости.

Ответ 2

Может быть, вы должны использовать application.properties в проекте агрегатора верхнего уровня?

Вы всегда можете использовать @PropertySource в дочерних проектах, чтобы настроить их с именем, специфичным для их использования.

Или вы можете использовать разные имена для каждого проекта и склеивать их вместе в проекте верхнего уровня, используя spring.config.location (разделенные запятой).

Ответ 3

Еще одна вещь, которую вы можете сделать (помимо использования только application.properties на верхнем уровне, как упоминает Дэйв Сиер), - это назвать файл свойств модуля домена чем-то вроде domainConfig.properties.

Таким образом вы избежите столкновения имени с помощью application.properties.

domainConfig.properties будет содержать все данные, необходимые для того, чтобы модуль домена мог протестировать его самостоятельно. Интеграцию с остальной частью кода можно легко выполнить либо с помощью нескольких @PropertySource (один для domainConfig.properties и один для application.properties), либо для настройки PropertySourcesPlaceholderConfigurer bean в вашем Java Config (проверьте этот учебник), который ссылается на все необходимые файлы свойств

Ответ 4

Возможно, другой подход может заключаться в определении конкретных профилей для каждого модуля и использовании файла application.properties, чтобы указать, что профили ведьм активны используя свойство spring.profiles.include.

domain-module
- application.properties
- application-domain.properties

app-module
- application.properties
- application-app.properties

и в файл application.properties app-module

spring.profiles.include=domain,app