Мультимодуль Maven: объединить общие зависимости в один?

Я искал такой вопрос, но ничего не нашел, так что я иду.

У меня есть многомодульный проект maven. Все несколько модулей наследуют одного и того же родителя, в котором определены общие зависимости. Среди них есть один мой собственный модуль, «общий», в котором реализованы некоторые общие функции.

Мой вопрос: что было бы лучше для общих зависимостей: определить их все явно в родительском элементе, как я сейчас делаю? Или определить их в «общем» модуле, на который ссылаются другие модули, а затем полагаться на транзитивность (например, единую точку входа для общих зависимостей)?


person Eleaar    schedule 22.05.2011    source источник


Ответы (2)


Лучше всего использовать тег dependencyManagement в родительском pom для определения ваших зависимостей и их версий, а затем ссылаться на эти зависимости в ваших подмодулях, где это необходимо. Когда вам требуются другие подмодули в вашем проекте (то есть ваш общий подмодуль из другого подмодуля), тогда зависимости будут найдены транзитивно. Например:

В родительском помпе:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

В вашем общем помпе (обратите внимание, что нет версии или объема):

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
  </dependency>
</dependencies>

А затем вы можете просто сослаться на свой общий подмодуль из других подмодулей, если вы уже используете его.

person Caps    schedule 26.07.2011
comment
Однако имейте в виду, что управление зависимостями очень распространено. Т.е. если A - ›B, A -› C: 1.0 и B - ›C: 2.0 посредством управления зависимостями, то в сборке A вы получите C: 2.0 вместо C: 1.0, как и следовало ожидать от типичного правила транзитивной зависимости. Чтобы получить нужную вам версию, A должен использовать управление зависимостями, чтобы принудительно установить C: 1.0. Отсюда: вирусный. - person Ryan Stewart; 26.07.2011
comment
Да, я знаю тег dependencyManagement, но я рассматриваю его больше как средство обеспечения соблюдения версий зависимостей в проекте без избыточности, подверженной ошибкам. Однако вам все равно нужно объявить сами зависимости в каждом модуле. Я скорее думал о ситуации, когда все (или почти) модули разделяют некоторую зависимость: независимо от управления версиями, лучше ли определять эти глобальные зависимости в родительском ( как я сейчас делаю) или создать модуль для этой конкретной цели, от которой зависят все остальные? - person Eleaar; 30.07.2011
comment
Я использую dependencyManagagement, как описано выше, и помещаю зависимости каждого модуля в POM уровня модуля, если зависимость всегда не для 100% модулей ... затем я помещаю его в родительский POM. НЕ помещайте в родительский POM зависимости, которые не нужны в каждом дочернем POM, и определенно не создавайте проект только для получения зависимостей. Повторение этих зависимостей в дочерних модулях не представляет большого труда, потому что вам не нужно указывать версию, поскольку строфа dependencyManagement в родительском модуле делает это за вас. - person HDave; 20.09.2011

Я вижу два разумных варианта:

Второй вариант полезен, когда у вас есть несколько модулей, зависящих от одного и того же большого стека компонентов со своими собственными зависимостями.

person Eugene Kuleshov    schedule 26.07.2011