На мой взгляд, разделение проекта должно быть довольно мелкозернистым, даже для "только веб-приложения".
Я бы сделал отдельные проекты для интерфейсов и реализации уровня доступа к данным, интерфейсов и реализации бизнес-уровня и самого веб-приложения. Я также хотел бы сделать по крайней мере один «общий» проект для содержания кода, относящегося к нескольким другим проектам. Но это только начало. Я без колебаний извлеку проект commons-util для классов утилит, соответствующих независимо от разрабатываемого приложения (String, Date, Reflection и т. Д.). Я бы также сделал проект для полезных утилит при тестировании (commons-test). И это только следующий шаг ...;)
Если бы я написал в целом полезный код, относящийся к hibernate, я бы поместил его в проект hibernate-utils. Полезные утилиты Spring будут включены в проект spring-utils и т. Д. При этом многие проекты содержат только один или несколько пакетов, а пакеты обычно содержат несколько классов.
Я считаю, что это помогает мне думать о коде, который я пишу. Это ДЕЙСТВИТЕЛЬНО бизнес-логика, или это общая обработка строк, манипулирование датами, специфичная логика Hibernate и т. Д.? Мои слои становятся чище, и становится сложнее получать круговые зависимости между пакетами и проектами (мы не хотим их). Кроме того, становится намного проще повторно использовать код в других проектах. Всегда будут другие проекты ...
Я также обнаружил, что новым разработчикам легче освоить структуру, потому что проекты становятся меньше и более управляемыми; легче начать кодирование, когда вы чувствуете, что вам не нужно все понимать.
В качестве последнего преимущества мелкозернистого подхода время сборки сокращается, поскольку вам не нужно каждый раз собирать все.