dependencyManagement и область действия

Я обычно помещаю <dependencyManagement> раздел в parent-project/pom.xml. Этот раздел <dependencyManagement> содержит объявление и версию для всех зависимостей моих дочерних модулей, подобных этому (то есть без элемента <scope>):

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
    </dependency>
  </dependencies> 
</dependencyManagement>

Во всех дочерних модулях (например, moduleX / pom.xml) у меня есть:

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

Очевидно, что в этом примере я повторяю <scope>test</scope> несколько раз для одной и той же зависимости (один раз в каждом дочернем модуле, нуждающемся в junit).

Мой вопрос:
Каковы лучшие практики в отношении объявления <scope>?
Лучше поместить его в <dependencyManagement>?
Или лучше поместить его в раздел <dependencies> дочернего модуля (например, в эта почта)? И почему?
Есть ли однозначный ответ на этот вопрос?


person ben75    schedule 05.03.2013    source источник


Ответы (4)


Немного поздно на вечеринку, но я добавлю свои два цента.

Недавно я столкнулся с очень сложной для отладки проблемой.
У меня есть родительский pom для управления зависимостями в нескольких проектах. Я установил для него все общие для них зависимости и включил groupId, artifactId, version и наиболее распространенные scope.
Я думаю, что мне не нужно включать область видимости в фактическую раздел зависимостей в каждом проекте, если он соответствует наиболее распространенному scope.
Проблема возникает, когда некоторые из этих зависимостей проявляются как транзитивные зависимости. Например, если:

  • A зависит от B в области компиляции.
  • B зависит от C в области компиляции.
  • C установлен в dependencyManagement родительского элемента.

Затем определяется транзитивная зависимость A от C. Я не совсем уверен, имеет ли это смысл или нет, но это определенно сбивает с толку.

В любом случае, избавь себя от хлопот и не включай scope в свой dependencyManagement.

person Lucas    schedule 23.12.2013
comment
это имеет смысл, но плохо документировано, см. maven. 40175.n5.nabble.com/, я редактирую свой ответ ниже - person Gab; 09.08.2015

dependencyManagement здесь только для определения версии зависимостей для всех подмодулей проекта, единственная уместная область в этом разделе - import для спецификаций.

Объем должен быть определен в разделе dependencies.

(Для данной зависимости он определяет контекст использования. Он позволяет включать зависимость только тогда, когда она требуется для выполнения. Например, ухо не будет упаковано с зависимостями Java-ee (область provided), поскольку оно найдет их на целевом сервере.)

[изменить]

У первого оператора есть исключение, область видимости provided в разделе dependencyManagement переопределит определенную область в dependencies разделах. см. DependencyManagement, чтобы задать область видимости

person Gab    schedule 05.03.2013
comment
единственная уместная область действия в этом разделе - импорт, означает ли это, что если я помещу область test в dependendcyManagement: это не даст никакого эффекта? - person ben75; 05.03.2013
comment
На самом деле кажется, что я не совсем прав ср. maven.40175.n5.nabble.com/ dependencyManagement имеют интерес - person Gab; 05.03.2013

Как и в случае с другими ответами, рекомендуется исключить область действия из dependencyManagement и явно указать ее при определении зависимости. Это редкий случай, когда вам нужна другая версия одной и той же зависимости в разных областях, например, одна версия при компиляции вашего приложения и другая при его запуске - единственный случай, о котором я могу думать, это то, что вы хотите явно запустить свой проверяет другую версию библиотеки на случай, если пользователи используют эту версию вместо указанной вами.

Если вы определяете область в dependencyManagement, она ограничивает использование этой версии ТОЛЬКО определенной областью, поэтому любые другие области будут выбирать случайную версию зависимости. Я столкнулся с этим вчера, когда мы определили junit 4.12 в dependencyManagement с областью тестирования, но наш общий модуль тестовой среды использовал junit с областью компиляции, поэтому вместо нее была выбрана версия 4.8.2.

person Phil    schedule 25.02.2015

Нет никакой выгоды в добавлении одной зависимости к управлению зависимостями для любой области. Все, что у вас есть, - это дублирование. Если вы хотите, чтобы версия настраивалась, добавьте свойство и используйте его в своей зависимости:

<properties>
        <junit.version>4.10</junit.version> 
    ...
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
    </dependency>
</dependencies>

Однако бывают случаи, когда управление зависимостями проявляется ярко - когда вы используете boms для оркестровки версий для более крупных коллекций артефактов, например, при использовании определенной версии реализации Java EE:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.jboss.bom</groupId>
            <artifactId>jboss-javaee-6.0-with-tools</artifactId>
            <version>${javaee6.with.tools.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
....
person kostja    schedule 05.03.2013
comment
dependencyManagement (даже с одной зависимостью) - единственное место, где определяется версия артефакта. На мой взгляд, одного этого факта достаточно, чтобы им воспользоваться. Использование свойства полезно, поскольку у вас есть несколько артефактов, которые всегда имеют один и тот же идентификатор версии (например, весенние модули) - person ben75; 05.03.2013
comment
Еще одна причина использования dependencyManagement - централизованное исключение нежелательных транзитивных зависимостей для зависимости. - person Vsevolod Golovanov; 27.04.2016
comment
Другая причина использовать свойство для версии состоит в том, чтобы вы могли быстро проверить наличие обновлений версии зависимостей с помощью mvn versions:display-property-updates - если вы позаботитесь о том, чтобы указать свойства своей версии в шаблоне artifactId.version - person Hank D; 14.12.2016