Многомодульная структура проекта Maven

Я создаю распределенное приложение, основанное на интерфейсе API-интерфейса front-end (read: web-face), который вызывает базовые (чтение: не веб-интерфейс) Thrift Services.

В качестве примера у меня может быть:

  • служба аутентификации (содержит код для аутентификации)
  • core-service (содержит генерируемые источники бережливости и некоторые общие классы, такие как логика обнаружения и инициализации службы)

Все индивидуальные службы зависят от основных сервисов, а также API-интерфейс, ориентированный на HTTP. Я имею это как многомодульный проект прямо сейчас, но я бы хотел, чтобы каждый был отдельным (и отслеживался в своих собственных репозиториях), хотя я знаю, что все еще могу сделать это с помощью сборки нескольких модулей.

tl; dr -

Является ли обычной практикой сборки модулем (core-service), который создается индивидуально, а затем перенаправляется на maven-репо (а затем включается как банка в других проектах), или было бы лучше в этом случае выполнить многомодульный проект?

Ответ 1

Лично я стараюсь избегать многомодульных проектов, так как, если вы используете Maven Release Plugin, вы заблокированы, чтобы освободить все ваши модули вместе.

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

Вы также получаете удар, если вы используете CI с многомодульными проектами - вы, как правило, запускаете все модули из корневого помпы, но если вы работаете в определенном модуле, вы в конечном итоге получаете удар создания тех, которые не изменились, по сути теряя некоторые преимущества, которые должна была обеспечить модуляция.

Итак, идите с независимыми модулями, но, и это важный бит, создайте общую "зависимость", используемую каждым.

"зависимость" pom - это pom, который стандартизирует все зависимости в ваших проектах и ​​отличается тем, что эти зависимости указаны в разделе dependencyManagement, а не в разделе dependencies (он также устанавливает стандартную конфигурацию плагина, и т.д). Это позволяет вашим проектным псам указывать зависимость pom как своего родителя, а затем объявлять зависимости, которые им нужны, за вычетом версий, которые выбираются из "зависимостей" и таким образом стандартизированы в ваших проектах.

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

Ответ 2

Я бы сказал, что многомодульный проект лучше. В случае размещения основной службы в репозитории разработчики должны заботиться о версиях. Developer1 нуждается в старой службе, но Developer2 обновляет эту службу.

Несколько ветвей также могут быть проблемой.

Ответ 3

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

Сильным примером этого в мире OSS является проект apache camel. Например, все связанные компоненты существуют как отдельные модули, которые могут быть включены отдельно в ваш проект, но привязаны к тому же жизненному циклу, что и верблюд основного распределения.

Многомодульные сборки Maven допускают некоторые удобства, когда дело доходит до размещения ваших проектов в CI или загрузки их в IDE, например, но, вообще говоря, если все отдельные модули не имеют одного и того же жизненного цикла, -модуль не очень подходит

Ответ 4

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

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

В нашем проекте мы пошли на какой-то промежуточный выбор: у нас есть многомодульная структура, но все проекты находятся в независимых репозиториях Subversion, так что они могут разветвляться отдельно, и мы используем агрегатор проект, чтобы выбрать, как смешивать и сопоставлять проекты из разных отраслей с помощью svn:externals, чтобы создавать индивидуальные выпуски для конкретных клиентов.

Недостатком является то, что поддержание подобной структуры является сложным и трудоемким. Мы разработали значительное количество сценариев, чтобы частично автоматизировать эти задачи. Это особенно обременительно, потому что Maven release plugin не способен обрабатывать модули, подключенные с помощью внешних субверсий.