Я голосую за вложение. Я использую IDEA 9, которая показывает вложение на панели проекта, поэтому презентация отражает вашу логическую структуру проекта. (Это было не так в 8.1 - это было выровнено.)
Я предпочитаю хранить вещи вложенными, особенно если имена очень похожи - значительно упрощает навигацию при использовании командной строки. У меня есть проект с такими именами, как myapp-layer-component, поэтому все они начинаются с одного и того же префикса, и многие имеют одинаковый -layer-, поэтому использование автозаполнения в командной строке практически бесполезно. Разделить их на вложенную структуру будет намного проще, потому что каждая часть имени (имя приложения, слой или компонент) повторяется только один раз на каждом уровне в структуре каталога.
При сборке из командной строки гораздо проще создать подмножество проекта, например, если я работаю над моделью БД, то часто мне нужно строить все проекты в этой области. Это сложно сделать, когда файлы выровнены - единственный известный мне способ - использовать аргумент -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 могут быть выведены из родительского, но я нашел длинные имена каталогов немного громоздкими.