Если вы программируете для интерфейсов (всегда хорошая идея для системы любого разумного размера / сложности), то решение, которое часто работает хорошо, состоит в том, чтобы проект / пакет содержал определения интерфейса, разделенные разумно; e.g.:
com.mycompany.cms.domain.foo
com.mycompany.cms.domain.bar
com.mycompany.cms.domain.bar.user
com.mycompany.cms.domain.bar.page
Этот набор интерфейсов используется всеми слоями в системе, и мы надеемся, что фактические конкретные реализации могут оставаться "частными" для слоя; например, на вашем уровне доступа к данным у вас может быть:
package com.mycompany.cms.dataaccess.bar.user;
import com.mycompany.cms.domain.bar.user.CMSUser;
@Entity
@Table("CMS_USER")
public class CMSUserJPA implements CMSUser {
...
}
, которая является реализацией CMSUser
, которая была соответствующим образом аннотирована для использования со слоем доступа к данным JPA.
Очевидно, что у вас будет определенное «зеркальное отражение» структуры пакетов интерфейсного проекта в ваших реализующих проектах - что делает действительно важным , чтобы получить эту структуру правильно - как Шон Патрик Флойд говорит, что в другом ответе вы должны найти таксономию, которая является одновременно значимой и сохраняет количество файлов на пакет в допустимом диапазоне.