Я работаю над многомодульным проектом Maven, где каждый модуль представляет собой приложение весенней загрузки (т.е. упаковано в виде исполняемого файла jar). Некоторые модули зависят от других. В проекте используется platform-bom версии 1.1.4.RELEASE.
Я обнаружил то, что считаю странной логикой для принятия решения, какие файлы свойств приложения использовать - хотя это явно не противоречит информации на https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html, в лучшем случае он все еще кажется неинтуитивным.
Ситуация была обнаружена при следующем стечении обстоятельств:
Модуль A имеет файл application.properties в своей папке ресурсов, поэтому он упакован в корень загрузочного jar-файла Spring. Этот application.properties определяет стандартный источник данных Spring JPA.
Модуль B зависит от A, но имеет в нем свой собственный файл свойств application.yml (а также файл .properties для конкретного профиля, например application-foo.properties). В этом файле нет записей для источника данных JPA, но код ожидает, что источник данных будет внедрен.
Неожиданно оказалось, что application.properties из A считываются, когда тесты B выполняются в сборке Maven, и используются для настройки источника данных, используемого B. Из приведенной выше ссылки можно сделать вывод, что это правильное поведение ("путь к классам root "в 24.3 может означать в корне jar в пути к классам, который будет jar A при запуске тестов для B). NB, свойства .yml также обрабатываются.
Однако, если я предоставлю пустой application.properties в ресурсах B вместе с файлом .yml, кажется, что это будет иметь приоритет во время тестов, и application.properties из A больше не будет обрабатываться вообще. Файл .yml все еще обрабатывается.
Из документации я бы подумал, что все подходящие файлы свойств должны быть обработаны, т.е. если A application.properties читается, то это все равно должно быть, если B предоставляет свой собственный файл (с приоритетом B). Также кажется, что файлы .properties и .yml не обрабатываются одинаково (существование application.yml не препятствовало чтению application.properties A, но наличие application.properties в B помешало).
Пожалуйста, не мог бы кто-нибудь прояснить, что такое ожидаемое поведение, и прокомментировать, правильна ли документация (ссылка выше)? Особенно:
1) Если в документации указано, что файлы свойств могут быть загружены из «корня пути к классам», должен ли он также включать корень любых jar-файлов в пути к классам?
2) Должно ли предоставление application.properties в B останавливать обнаружение A?
3) Следует ли по-другому рассматривать свойства .yml в связи с этим поведением?
application.properties
B. Вы должны создатьa.properties
в проекте A. И в классе A@Configuration
вы будете использовать@PropertySource("classpath:/a.properties")
- person Thang Hoang   schedule 18.12.2015