2015-12-10 4 views
7

Могу ли я настроить Maven для выбора «новейшей» зависимости от конфликта, а не от «ближайшего»?Стратегия посредничества зависимостей Maven к новейшим, а не ближайшим

«новейших», по умолчанию Айви и других менеджеров чувственных зависимостей см http://ant.apache.org/ivy/history/2.2.0/settings/conflict-managers.html

Я считаю «ближайшая» стратегия редко бывает, что я хочу.

Я использую Maven 3.3.3, но при необходимости я могу переключать версии.

Я знаю, как переопределить выбор Maven по отдельным конфликтам, но я бы предпочел изменить значение по умолчанию, чтобы мне не приходилось обнаруживать и исправлять каждый конфликт по одному за раз.

(См the Maven docs на «Dependency посредничество»)

+1

Если вы говорите, что редко вам не хочется, это одно мнение. Насколько я знаю, нет простого способа изменить это поведение ... Что вы можете сделать, так это предоставить патч, который изменяет поведение в Maven Core ... Чтобы обнаружить такие вещи, вы можете использовать правила соблюдения правил, чтобы идентифицировать такие ситуации. .. – khmarbaise

+2

[Это обсуждение] (http://maven.40175.n5.nabble.com/Adding-support-for-new-dependency-mediation-strategy-td5768185.html) при предыдущей попытке добавить эту функцию в Maven стоит прочитать. – heenenee

+3

Спасибо, @heenenee. Теперь я вижу, почему Maven не развился вообще за последние 10 лет или около того, он, кажется, полностью умирает. Возможно, я попытаюсь переключить свой проект на SBT, который имеет разрешение конфликтов с более поздними версиями, и может потреблять Maven deps и поддерживается IntelliJ. – Rich

ответ

2

Могу ли я настроить Maven автоматически использовать «новейшую» версию зависимости вместо «ближайшего» при разрешении конфликта версий?

Нет, вы не можете настроить зависимость стратегии посредничества Maven на что-нибудь другое, чем ближайший.

Добавление configurable dependency mediation strategies has been proposed before, но в конечном итоге было отказано, поскольку предложение включало изменение POM XSD, чего не было в течение многих лет.

Почему Maven использует самую близкую стратегию по умолчанию?

Стратегии ближайшего благоприятствуют Maven по двум причинам:

  1. Easy переопределение индивидуальных конфликтов: Для любой конкретной противоречивых зависимости, вы можете указать его версию в своей собственной POM, и эта версия станет ближайшей.
  2. Возпроизводимо строит: Это было на самом деле является результатом наличия version ranges в любом месте вашего графа зависимостей, но посредническая стратегия «новейший», несомненно, усилить воздействие любой диапазон версий на сборки воспроизводимости.

Но я действительно хочу другую стратегию посредничества зависимости. Что я могу сделать?

Это ваши лучшие варианты:

  1. Сделать расширение Maven: Использование "ближайшего" стратегии определяется NearestVersionSelector in MavenRepositorySystemUtils. Вы можете: create your own Maven extension который определяет ваш собственный VersionSelector, который реализует вашу стратегию по вашему выбору, а затем в методе вашего добавочного номера afterSessionStart, замените номер на сеанс связи, используя ваш пользовательский VersionSelector.
  2. Перенести на другой инструмент для сборки: Очевидно.
+0

Спасибо. Может ли плагин сборки не переопределять это поведение? Это даст возможность изменить это без изменения POM XSD. – Rich

+0

Этот комментарий предполагает, что плагин сборки не может изменять зависимости: «Maven 3.x представил изменения в разрешении зависимостей, что делает невозможным оптимальное функционирование этого плагина. В Maven 3.x все зависимости разрешаются до начала жизненных циклов, невозможно, чтобы плагин загружал и устанавливал внешние зависимости до того, как Maven разрешит зависимости проекта ». https://github.com/UniversalMediaServer/external-maven-plugin#external-dependency-maven-plugin – Rich

+0

Для чего предназначен этот класс? https://github.com/apache/maven/blob/master/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/NewestConflictResolver.java – Rich

1

Вы также можете использовать "requireUpperBoundDeps" правило для «Инфорсер» плагин Maven, который не будет непосредственно реализовывать «новые победы» разрешение конфликта политики, но будет обеспечивать, что конечный результат будет таким же. Вам нужно будет вручную добавить транзитивную зависимость <exclusions> или <dependencyManagement> правил вашей POM, чтобы выбрать самую новую зависимость в каждом конфликте, но, по крайней мере, вы будете уверены, что конечный результат - это «самые новые победы».

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.4.1</version> 
    <executions> 
     <execution> 
     <id>enforce</id> 
     <configuration> 
      <rules> 
      <requireUpperBoundDeps /> 
      </rules> 
     </configuration> 
     <goals> 
      <goal>enforce</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin>