Мы работаем над Mavenizing нашим проектом java, и мы хотели бы установить четкое разделение между интерфейсами и реализациями для каждого модуля. Для этого мы хотим разбить каждый модуль на два подмодуля, один для интерфейсов и объектов данных, используемых ими, а другой для реализации. Например:
+commons
+commons-api
+commons-impl
POMs модулей будут сконфигурированы таким образом, чтобы ни один модуль не зависел от подмодулей impl. Таким образом, ни один код из одного модуля не сможет "увидеть" детали реализации другого модуля.
С чем мы сталкиваемся, где разместить наши spring XML файлы. В нашем проекте мы автоматически импортируем XML файлы spring с помощью подстановочного импорта, например
<import resource="classpath*:**/*-beans.xml"/>
Таким образом, расположение XML файлов spring не имеет особого значения во время выполнения, так как все модули загружаются в один загрузчик классов, а строгие правила односторонней зависимости в POM не применяются.
Однако во время разработки мы хотим, чтобы IDE - мы использовали Intellij IDEA - для распознавания классов реализации, на которые ссылаются XML spring. Мы также хотим, чтобы IDEA распознавала beans, определенные в других модулях.
Если мы поместим XML файлы spring в подмодули API - они не будут "видеть" классы реализации в подмодулях impl. Если мы разместим их в подмодулях impl, их beans не будет "замечен" из других модулей. Вероятно, можно настроить проект IDEA на распознавание XML файлов spring из модулей, на которых нет зависимости, но мы предпочитаем, чтобы наши POM сохраняли всю информацию о структуре проекта и не полагались на файлы проекта IDEA.
Мы рассмотрели создание третьего подмодуля только для хранения XML файлов spring (и, возможно, спящего режима xmls). Например:
+commons
+commons-api
+commons-impl
+commons-config
Внешние модули будут зависеть как от commons-api, так и commons-config и commons-config будут зависеть как от -api и commons-impl, при этом зависимость от commons-impl помечена как "предоставлена" (чтобы предотвратить переходное разрешение).
Это, однако, похоже на сложное и неудобное решение, и мы считаем, что должен быть лучший - более простой способ добиться разделения интерфейса/импликации с Maven и Spring.