После долгих проб и ошибок я закончил с этим, и он работает:
service-tier
- это проект Maven, содержащий аннотации @Service
и @Repository
.
Содержит зависимости spring-boot-starter-parent
, spring-boot-starter-web
, spring-boot-starter-jdbc
, spring-boot-starter-security
, а также драйвер базы данных. Также есть некоторые тестовые зависимости: JUnit, spring-boot-starter-test
и spring-security-test
. Это почти все зависимости, которые использует внешнее приложение, за исключением Thymeleaf и некоторых артефактов Webjars.
Я не знаю, делают ли аннотации что-нибудь для меня или нет, но я держал их в себе.
Через некоторое время я вспомнил, что у проектов Maven есть каталог test
для классов и ресурсов, которые будут использоваться только в тестировании и не будут поставляться в комплекте с упакованным JAR или ВОЙНА. В этой структуре каталогов я поместил аннотированный класс @SpringBootApplication
, а также application.yml
с информацией о подключении к базе данных. Это используется при выполнении интеграционных тестов и не влияет на веб-приложения, которые зависят от уровня обслуживания.
Внешние приложения - это собственные проекты Maven. В каждом из них:
- Они объявляют
service-tier
как зависимость. - Они также объявляют все зависимости Spring Boot. Многие излишни, но это не проблема с Maven. Дополнительные зависимости включают
spring-boot-starter-thymeleaf
и несколько других зависимостей Thymeleaf, а также несколько зависимостей от org.webjars, которые включают Bootstrap и JQuery. - Они также имеют свои собственные
@SpringBootApplication
аннотированные классы и application.yml
. Это «реальные» конфигурации, а не только тестовые конфигурации. - Все классы
@Controller
, а также шаблоны Thymeleaf и файлы stati c и messages.properties
находятся в этих интерфейсных проектах. - Конфигурация Spring Security (т.е.
WebSecurityConfigurerAdapter
экземпляров) находится в этих проектах. (UserDetailsService
находится на уровне обслуживания.)
Это работает довольно гладко, пока я удостоверяюсь, что интерфейсные приложения всегда вызывают последнюю версию service-tier
.
Одно интересное осложнение заключается в том, что приложение Spring Boot будет сканировать только классы обслуживания и хранилища в пределах своего собственного пакета Java. Изначально у меня был уровень обслуживания в иерархии пакетов, такой как "com.mycompany.servicetier
", а внешние интерфейсы в пакетах, таких как "com.mycompany.appone
" и "com.mycompany.apptwo
". Мне пришлось переместить аннотированный класс @SpringBootApplication
в каждом внешнем проекте на один уровень выше, до "com.mycompany
", чтобы он обнаруживал классы уровня обслуживания "под ним" для внедрения зависимостей.