Там, где я работаю, мы используем Maven 2, и у нас есть довольно хороший архетип для наших проектов. Цель состояла в том, чтобы получить хорошее разделение интересов, поэтому мы определили структуру проекта, используя несколько модулей (по одному для каждого уровня приложения):
- common: общий код, используемый другими уровнями (например, i18n)
- сущности: доменные сущности
- репозитории: этот модуль содержит интерфейсы и реализации daos
- services-intf: интерфейсы для служб (например, UserService, ...)
- services-impl: реализации сервисов (например, UserServiceImpl)
- web: все, что касается веб-контента (например, css, jsps, jsf pages, ...)
- ws: веб-сервисы
Каждый модуль имеет свои собственные зависимости (например, репозитории могут иметь jpa), а некоторые имеют проектный характер (поэтому они принадлежат общему модулю). Зависимости между различными модулями проекта четко разделяют вещи (например, веб-уровень зависит от уровня сервиса, но не знает о слое хранилища).
Каждый модуль имеет свой собственный базовый пакет, например, если пакет приложения "com.foo.bar", то мы имеем:
com.foo.bar.common
com.foo.bar.entities
com.foo.bar.repositories
com.foo.bar.services
com.foo.bar.services.impl
...
Каждый модуль соответствует стандартной структуре проекта Maven:
src\
..main\java
...\resources
..test\java
...\resources
Модульные тесты для данного слоя легко находят свое место в \ src \ test ... Все, что относится к области, имеет свое место в модуле entity. Теперь что-то вроде FileStorageStrategy должно войти в модуль репозиториев, поскольку нам не нужно точно знать, что такое реализация. На уровне сервисов мы знаем только интерфейс репозитория, нам все равно, какова конкретная реализация (разделение задач).
У этого подхода есть несколько преимуществ:
- четкое разделение интересов
- каждый модуль может быть упакован как jar (или война в случае веб-модуля) и, таким образом, облегчает повторное использование кода (например, мы можем установить модуль в хранилище maven и использовать его в другом проекте) *
- максимальная независимость каждой части проекта
Я знаю, что это не отвечает на все ваши вопросы, но я думаю, что это может поставить вас на правильный путь и оказаться полезным для других.