2013-06-17 4 views
12

Я создаю распределенное приложение, основанное на интерфейсе HTTP-интерфейса с интерфейсом front-end (read: web-обратный), который вызывает базовые (чтение: не веб-интерфейс) Thrift Services.Структура проекта Maven с несколькими модулями

В качестве примера, я могу иметь:

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

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

Т.Л., д-р -

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

ответ

14

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

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

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

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

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

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

+0

Спасибо, что напомнили мне о моих проблемах с плагином релиза Maven :-) –

+3

Просто побочный комментарий об использовании многомодульных проектов - если все модули имеют разные жизненные циклы, то они не должны быть частью одного и того же многомодульная структура. @ colin-morelli должен принять это во внимание в своем решении. – whaley

+0

@whaley В настоящий момент все они имеют один и тот же жизненный цикл (частично потому, что все они сейчас находятся в проекте с несколькими модулями). Однако проект уже достаточно велик и требует немного времени для сборки, тестирования и развертывания. В идеале я бы * хотел * дойти до точки, где они могут быть выпущены независимо. –

7

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

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

+0

Thrift обрабатывает большинство изменений довольно изящно (если вы, например, не измените первый параметр сигнатуры метода на другой тип). Таким образом, вполне возможно, что служба A (которая была скомпилирована на версии 1 службы B) могла вызвать версию 2 службы B и не иметь никаких проблем. Это было частью поводов для сбережений - приложения могут быть слабо связаны. Но, вы делаете действительную точку, так что +1 от меня –

3

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

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

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

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

+1

Это было мое чувство (лучше, чтобы проекты развивались независимо). Вообще-то, что-то неладно было с самого начала создания мультимодульного проекта. К сожалению, временные ограничения оставили его не факультативным, но теперь у меня есть время пересмотреть это. Они, безусловно, будут поддерживаться отдельными командами. –

+0

Обратите внимание, что упомянутый выше подход, несмотря на то, что он, без сомнения, сложный, отбрасывает проект агрегатора именно так: способ объединить проекты (если хотите). Это позволяет нам иметь разные агрегаторы для разных подмножеств модулей с другой целью. Один, который объединяет все для выполнения выпусков, другой для проектов, которые упакованы в один файл WAR, и так далее. –

5

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

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

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

+0

Я принял решение пойти с отдельными модулями. Цените советы от всех. Дал ответ Нику, но +1 к вам, вы оба толкнули меня в этом направлении. –

Смежные вопросы