Есть несколько похожих вопросов, но ничего подобного. Как вы справляетесь с этой ситуацией (типичный сценарий):
Проект из 8-11 дочерних проектов, имеющий родительский артефакт / проект и один главный проект, который в основном использует / объявляет эти другие как модули.
Проблема в том, что все проекты "строго" разделяют только общие зависимости, такие как testng, logging, apache commons and stuff
. Но всегда, как 3 из них используют 50-60% тех же самых специфических депов (apache-chemistry, jackrabbit, abdera и т. Д.), Еще 2-3 из них также используют 50-60% тех же, но разных зависимостей , И основной использует много одинаковых deps.
Я не могу поместить эти "не строго" общие депы в родительский проект, чтобы другие могли их наследовать. Таким образом, только общие deps наследуются. И есть тонны повторяющихся зависимостей. И я могу управлять только их версиями через <dependencyManagement>
.
Другой вариант - родительский pom содержит большинство зависимостей, но дочерние проекты наследуют даже те, которые им не нужны.
У меня может быть более одного родительского проекта, но это не так. Также наследование от родительского проекта может быть кошмаром, потому что вы не знаете, какие зависимости нужны проекту, если вы не задокументируете / не прокомментируете определение родительского pom должным образом.
Другим способом является создание артефактов pom, которые служат только контейнерами зависимостей - они объявляют конкретные группы зависимостей, так что модули просто объявляют их для получения транзитивных зависимостей. Но, эй, вы бы хотели развернуть и зафиксировать что-то вроде
Объявление OneDepArtifact jackrabit, abdera, chemistry
Объявление другогоDepArtifact htmlcleaner, google-api, tika
Объявление ThirdDepArtifact spring, httpclient, selenium
Это большой беспорядок, я не уверен, правильно ли я использую <dependencyManagement>
, кажется, он полезен только для управления версиями зависимостей.
Я думал об адаптации разработки моего приложения к "многоуровневому дизайну Maven". Но если вы хотите создать Spring-сервисы / компоненты, которые просто используют различные библиотеки в одном модуле, вы не реализуете их в другом модуле только потому, что они используют библиотеку, которую использует другой модуль: -)