2014-02-10 3 views
10

Ну вот интересный опыт, который я имел с прошлой недели, структурируя свой проект с несколькими модулями maven.Проблемы с структурированием проектов Maven Multi Module

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

a. В основном команды разработчиков разделены так, что каждая команда может работать над отдельным модулем в рамках проекта, например Team-A, для работы в системе управления пользователями, Team-B для работы в системе авторизации, Team-C для работы в системе управления документами ... и скоро. В каждой команде есть разработчики java, тестеры, эксперты пользовательского интерфейса и т. Д.

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

И, таким образом, я пришел к выводу, что каждый модуль развития Maven проекта мульти-модуль должен представлять собой функциональный модуль

PROJECT STRUCTURE 1

После некоторых обсуждений на форумах я нашел людей, предлагая мне следовать многоуровневый подход был дочерние модули должны быть такими слоями, как слой контроллера, служебный слой, дао-слой и т. д. Я не обращал внимания на этот совет, потому что это не решает мою цель команд, работающих над отдельным модулем. Таким образом, для большого проекта увеличивается время сборки и развертывания для каждой команды во время разработки, что влияет на временные линии проекта. иногда время сборки и развертывания составляет до 30 минут, если в проекте есть 10-11 модулей.

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

Я нашел решение этой проблемы, создав общий модуль и переместив DAO и DOMAIN в общий модуль, который будет унаследован как зависимость от каждого модуля. И это, кажется, более жизнеспособный вариант. Теперь структура проекта выглядит так.

PROJECT STRUCTURE 2

Теперь, когда я построить проект и запустить веб-приложение на сервере, он жалуется на 404, ресурс не найден. Я обнаружил, что это происходит потому, что папка WEB-INF/classes отсутствует, src/main/java отсутствует в модуле веб-приложения. Я искал и нашел пару ссылок, которые предположили, что это проблема сборки развертывания в Eclipse. Поэтому мне нужно вручную создавать эти папки и добавлять в сборку развертывания, потому что maven этого не делает.

Но большие вопросы

  1. мне нужно переместить классы контроллера как com.mycompany.usermgmtsys.controller.UserMgmtController и т.д .. в SRC/основной/Java Или мавена должны найти контроллеры от модульные банки, включенные как зависимость в WEB-INF/lib.

Я не хочу этого делать, например, вставлять java-файл в веб-приложение. Я хочу, чтобы все контроллеры были доступны для веб-приложения в качестве зависимости, например, WEB-INF/lib/usermgmtsystem.jar. Но тогда Tomcat не будет искать контроллеры в папке классов.

Я не знаю, что мне делать? Мы ценим любые предложения.

+0

Вы хотите, чтобы ваши контроллеры/службы зависели от вашего веб-приложения? Это наоборот. Ваше веб-приложение является вашим клиентским слоем и должно быть на вершине вашей «стека» вашей архитектуры. Он должен вызывать в сервисный уровень, который затем организует запрос другим службам и/или доменному слою. – tdrury

+0

Нигде в моем вопросе я не хотел отменять порядок зависимостей. Все, что я ожидаю, это заставить веб-приложение идентифицировать свои контроллеры из своих зависимых банок, упакованных в ходе войны, так что нет 404. Если вы посмотрите на структуру, у меня все еще есть правильный порядок зависимости, то есть Common (который содержит DAO и DOMAIN) как зависимость от UserManagement, которая действует как зависимость от веб-приложения. Проблема в том, что я включил соответствующие контроллеры в соответствующие дочерние модули, они не найдены в папке WEB-INF/classes, а они находятся в WEB-INF/lib как банке. – RaghaveShukla

+0

Поскольку они являются зависимыми баночками, они должны быть в WEB-INF/lib. Это правильное поведение. – tdrury

ответ

0

Я понял вопрос. Контроллеры являются компонентами уровня представления. Диспетчер ожидает, что компоненты уровня представления в папке WEB-INF/classes в целевом объекте, а не ищет его в lib. Я не уверен, что это справедливо только для структурирования на основе maven в eclipse. Итак, наконец, это изменения, которые я сделал

a. Создал исходную папку src/main/java в веб-приложении. Он не генерируется по умолчанию в модуле веб-приложения. b. Добавьте пакеты и соответствующие контроллеры в папку src/main/java.

Таким образом, окончательная структура, что у меня есть (я не вставляя точное затмение снимок, это обобщенный вид)

Final Structure

0

Это хороший вопрос. Существует много аспектов, которые необходимо учитывать для полезного макета проекта. Я хотел бы попытаться ответить на тот, который вы не упомянули. Расширяется ли ваше приложение пользователями? Если это так, подумайте о создании отдельного модуля для вашего общедоступного уровня API (служебные интерфейсы, DTO, используемые этими службами, и Исключения, создаваемые службами).

В нашем приложении у нас есть несколько модулей maven на функциональную область. Идея состоит в том, что группа работала над функцией только в одной функциональной области, и эта изоляция не позволяла им взаимодействовать с источниками, которые были изменены другой группой. Каждая функциональная область далее разбивается на подмодули maven, которые мы называем «api», «domain» и «service» - мы не объединяем службы/контроллеры, домен и исключения в один модуль. Модуль api содержит те классы, которые мы хотим предоставить клиентам для их настройки. Наш уровень обслуживания - это реализация этих интерфейсов. Кроме того, мы не разрешаем службе одного модуля вызывать службу другого модуля, так как это обходит наш уровень взаимодействия с сервисом, где клиент может подключать расширения к нашим услугам. Использование отдельных модулей maven на функциональную область помогает обеспечить это.

У нас есть другие модули (внутренний-api, web, адаптер), но они действительно не добавляют к этой теме.

+0

Я не знаю, понял ли я ваш ответ, как ожидалось, или нет. Но мне кажется, что я делаю то же самое, что и вы, кроме того, что вы переходите на уровень выше при разделении модулей. В моем фактическом приложении родительский модуль имеет детей (mediamanager-webapp, usermanagement, authorizationmanagement, documentmanagement, управление производительностью, управление отчетами, управление уведомлениями). Таким образом, они делятся по функциональным областям. Но, похоже, вы дополнительно разделили ваши модули как подмодули «домен» и сервисы для каждого модуля. ваш публичный api такой же, как мой общий модуль. – RaghaveShukla

+0

Это хороший подход, который я изначально из дальнейшего подразделения. Но тогда я, хотя это будет излишним, поскольку с каждым последующим подразделением есть также дополнительная конфигурация maven, конфигурация пружины для поддержания. Во-вторых, даже мы не поощряем одну услугу к вызову другого до тех пор, пока не возникнет необходимость, поэтому общий модуль обеспечивает уровень DAO всех модулей, чтобы повторно использовать гранулированный DAO-уровень. В идеале, если вы рисуете трехслойную архитектуру с представлением -> услугой -> доступом к данным, вы увидите, что домен не принадлежит ни одному слою, а общему уровню. – RaghaveShukla

+1

Для простого администрирования большого количества модулей мы используем «шаблонные» POM и наследование POM. Все модули «api» наследуют от шаблона api POM, который использует для настройки конфигурации наших плагинов для всех модулей api. У нас есть шаблоны для сервисов, веб-сервисов, домена и т. Д. – tdrury

1

Сво путь затмения вынести проект на основе Maven. Обычно он создает две структуры. Один основан на master pom (родительский проект) и других на основе индивидуального модуля pom. однако изменения в любой структуре будут отражены в другом. Как практика, я вношу изменения в отдельные структуры папок модуля и читаю их более легко.

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

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

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

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

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

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

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