AD1. Они не будут, если вы не пытаетесь настроить независимый контекст приложения в каждом модуле. Конечно, вы можете сделать это (это может быть сложно, но я считаю, что это достижимо), но для меня это излишество. Лично я думаю, что лучше иметь один контекст приложения и полагаться на компоненты сканирования, которые присутствуют в classpath.
AD2. Структура в Maven может быть немного сложной и на первый взгляд ошеломляющей, но это имеет смысл. Вот как я это вижу:
- Создайте родительский модуль, который будет агрегировать каждый модуль в проекте и объявлять зависимости библиотеки / плагина для подмодулей.
- Создать 1-N общих подмодулей, которые будут использоваться в других модулях. Приходят общие логики c, utils, et c.
- Создание 1-N подмодулей, которые будут обрабатывать ваши бизнес-логи c
- Создание подмодуля приложения, создающего контекст приложения и загружает конфигурацию и компоненты из classpath
- Создайте подмодуль, который будет отвечать за процесс упаковки, либо war, jar, uber-jar или что-либо еще, что вы пожелаете. Maven jar плагин должен сделать это для вас. Для исполняемого uber-jar у вас есть специальный инструмент от Spring.
Теперь вы можете выбрать три способа (эти способы, как я знаю) загрузки ваших модулей. 1. Включите некоторые модули в сборку maven на основе конфигурации сборки через профили maven и позвольте контейнеру spring Io C загрузить все компоненты, которые он найдет в пути к классам 2. Включите все модули в сборку maven и загрузите их в зависимости от активной пружины профили - вы можете думать об этом как о признаке функции. Вы комментируете свои компоненты или класс конфигурации с помощью @Profile ("XYZ"), сообщая контейнеру Spring Io C, создавать ли экземпляр компонента или нет. Вам потребуется (наиболее гибкое решение) предоставить файл свойств, который сообщает Spring, какие профили активны и, следовательно, какие модули должны быть загружены. 3. Сочетание этих двух выше.
Плюсы решения 1:
- сборка выполняется быстрее (модули, которые не включены, будут пропущены во время сборки)
- файл окончательной сборки облегчен (модули, которые не включены, ... не включены;))
- никто не может запустить модуль, которого нет
Решение 1, контраст:
- Дескриптор проекта в maven может взорваться, поскольку у вас может быть много разных профилей
Плюсы решения 2:
- поддержка модулей из кода довольно проста и увлекательна
- меньше беспорядка в дескрипторе проекта
Решение 2 контрастное:
- кто-то может запустить модуль, который не предназначен для запуска, поскольку он присутствует в classpath, но только исключен во время выполнения с помощью активных профилей Spring
- файл окончательной сборки может иметь избыточный вес - un используемый код все еще присутствует в коде
- сборка может занять больше времени - неиспользуемый код будет скомпилирован
Резюме:
Нелегко построить хорошо структурированный проект с нуля , Намного проще создать монолит, а затем разбить его на модули. Это потому, что если вы уже создали проект, вы, вероятно, уже определили все домены и отношения между ними.
За последние 8 лет использования maven
я честно и настоятельно рекомендую использовать gradle
, так как гораздо более гибкий, чем maven
. Maven действительно отличный инструмент, но когда дело доходит до странной настройки, он часто терпит неудачу, поскольку его возможности сборки зависят от плагинов. Вы не можете написать фрагмент кода на лету, чтобы выполнить какое-то пользовательское поведение при сборке при создании проекта, для этого у вас должен быть специальный плагин. Если такой плагин существует, то это нормально, если его нет, вы, вероятно, в конечном итоге будете писать свой собственный и обрабатывать его отгрузку, поэтому любой сотрудник вашей компании может легко выполнить сборку проекта.
Надеюсь, это поможет. Веселись;)