В проекте Maven, каковы причины для вложенного или плоского макета каталога?

По мере роста моего проекта Maven я стараюсь оставаться на вершине структуры проекта. Пока что у меня есть вложенная директория с 2-3 уровнями, где на каждом уровне есть POM с module записи, соответствующие каталогам на этом уровне. Наследование ПОМ (parent свойство) не обязательно следует за этим, и не имеет отношения к цели этого вопроса.

Теперь, хотя вложенная структура кажется довольно естественной для Maven, и она хороша и чиста, пока вы находитесь на одном конкретном уровне, я начинаю путаться из-за того, что я смотрю в своей IDE (Eclipse и IntelliJ IDEA).

Я взглянул на исходники Apache Felix, и у них есть довольно сложный проект, который выглядит как плоская структура каталогов, поэтому мне интересно, будет ли это лучший путь?

Какие плюсы и минусы для любого подхода, который вы испытали на практике?

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

2 ответа

Решение

Я использую своего рода смешанный подход. Вещи с различным жизненным циклом (с точки зрения выпуска и, следовательно, VCS) плоские, вещи с одинаковым жизненным циклом вложены. И я пользуюсь svn:externals для проверки. Я написал об этом подходе в этом предыдущем ответе.

Я голосую за вложение. Я использую IDEA 9, которая показывает вложение на панели проекта, поэтому презентация отражает вашу логическую структуру проекта. (Это было не так в 8.1 - это было выровнено.)

Я предпочитаю хранить вещи вложенными, особенно если имена очень похожи - значительно упрощает навигацию при использовании командной строки. У меня есть проект с такими именами, как myapp-layer-component, поэтому все они начинаются с одного и того же префикса, и многие имеют одинаковый -layer-, поэтому использование автозаполнения в командной строке практически бесполезно. Разделить их на вложенную структуру гораздо проще, потому что каждая часть имени (имя приложения, слой или компонент) повторяется только один раз на каждом уровне в структуре каталога.

При сборке из командной строки гораздо проще создать подмножество проекта, например, если я работаю над моделью db, то часто мне нужно создавать все проекты в этой области. Это сложно сделать, когда файлы выровнены - единственный известный мне способ - использовать -pl аргумент maven и указать проекты для сборки. С вложенными каталогами я просто cd к db каталог и запустить mvn,

Например, вместо

myapp-web-gui1
myapp-web-gui2
myapp-web-base
myapp-svc-clustered
myapp-svc-clustered-integrationtest
myapp-svc-simple
myapp-db-model
myapp-db-hibernate

У нас есть структура

\myapp
   \web
     \gui1
        pom.xml
     \gui2
        pom.xml  (other poms omitted to keep it short)
     \base
   \svc
      \clustered
      \clustered-it
      \simple
   \db
      \model
      \hibernate      

Вы также можете добавить вложенность для интеграционных тестов, но это кажется слишком серьезным.

С вложением вы также получаете все преимущества наследования (и некоторые из его трудностей...)

Единственная проблема, с которой я столкнулся, заключается в том, что имя каталога не совпадает с идентификатором артефакта. (Я все еще использую полные artifactIds.) И поэтому каждый проект должен явно определять пути SCM, так как они больше не могут быть выведены из родительского pom. Конечно, каждый каталог может быть сделан так же, как artifactId, и тогда детали SCM могут быть выведены из родительского, но я нашел длинные имена каталогов немного громоздкими.

Другие вопросы по тегам