Где я работаю, мы используем Maven 2, и у нас есть довольно хороший архетип для наших проектов. Цель заключалась в том, чтобы получить хорошее разделение проблем, поэтому мы определили структуру проекта с использованием нескольких модулей (по одному для каждого слоя приложения): - общий: общий код, используемый другими слоями (например, i18n) - объекты: объекты домена - репозитории: этот модуль содержит интерфейсы daos и реализации - services-intf: интерфейсы для сервисов (например, UserService, ...) - услуги-осущ: реализации услуг (например, UserServiceImpl) - веб: все, в отношении веб-контента (например, CSS, JSP, JSF страницы, ...) - 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 ... Все, что является специфичным для домена, имеет свое место в модуле сущностей. Теперь что-то вроде FileStorageStrategy должно войти в модуль репозиториев, так как нам не нужно точно знать, что такое реализация. На уровне сервисов мы знаем только интерфейс репозитория, нам все равно, какова конкретная реализация (разделение проблем).
Есть несколько преимуществ такого подхода:
- четкое разделение проблем
- каждый модуль packageable в банке (или войны в случае веб-модуля) и, таким образом, позволяет легче кода повторное использование (например, мы могли бы установить модуль в репозитории Maven и использовать его в другом проекте)
- максимальную независимость каждой части проекта
Я знаю, что это делает не отвечайте на все ваши вопросы, но я думаю, что это может привести вас к правильному пути и может оказаться полезным для других.
Очевидно, нет окончательного ответа, но после использования maven2 некоторое время я приступил к определению данной структуры, и поэтому я объявляю ответ maven как один. (Это не значит, что другие ошибаются или что-то еще) Я просто понял, насколько проще не думать о начальных этапах вашей сборки, вы просто бросаете свои источники и источники в те данные каталоги и компилируете их без создания файлов муравьев и т. д. – Mauli 2009-05-15 12:51:20