Maven classpath порядка проблем - PullRequest
41 голосов
/ 27 апреля 2009

Кто-нибудь знает способ установить определенный порядок пути к классам в Maven2, а не случайный порядок, который я, похоже, испытываю в данный момент?

Есть ряд законных причин для этого:

  • Поставщик предоставил jar-пакет исправления, который содержит переопределяющие классы для ранее выпущенного jar-файла, и поэтому jar-файл исправления должен стоять первым в порядке следования по пути к классам.
  • Два файла jar, найденные на пути к классам при обнаружении зависимостей pom, содержат один и тот же класс в одном и том же пакете с разными сигнатурами. Например:

jboss jbossall-клиент 4.2.0.GA

org.hibernate зимовать 3.1

оба содержат: org.hibernate.util.ReflectHelper.class, но в версии jbossall-client отсутствует метод getFastClass.

Из поиска в Google я вижу, что это, возможно, является предметом спора между энтузиастами maven и людьми, сталкивающимися с этой конкретной проблемой, но, безусловно, есть законные причины для заказа путей к классам.

Буду весьма признателен за любые советы от тех, кто решил эту конкретную проблему!

Спасибо

Ответы [ 2 ]

39 голосов
/ 27 апреля 2009

Начиная с версии 2.0.9 maven использует порядок pom для classpath, так что вы можете управлять им сейчас. Мы в основном подавляем транзитивные зависимости во внешние библиотеки, которые мы также включаем напрямую.

Из примечаний к выпуску Maven 2.0.9:

В MNG-1412 / MNG-3111 введено детерминированное упорядочение зависимостей от пути к классам. В прошлом использовалось естественное упорядочение множеств, что приводило к странным результатам. Порядок теперь сохраняется из вашего pom, с зависимостями, добавленными наследованием, добавленным последним. В сборках с конфликтующими или дублирующимися зависимостями это может привести к изменению выходных данных. Короче говоря, если у вас есть странные проблемы с 2.0.9, посмотрите на зависимости, чтобы увидеть, есть ли где-нибудь конфликты.

1 голос
/ 17 июля 2010

В Maven 2.0.9 добавлено правильное упорядочение, поэтому для работы ниже обязательно должна быть указана эта версия или выше.

Во-вторых, вам нужен обновленный плагин. Ребята из Maven работают над исправлением, его исправление в их jira, но это то, что мне срочно нужно. Итак, пока я сам исправил это, и вы можете извлечь Модифицированный исходный код плагина из github.

Редактировать: см. http://jira.codehaus.org/browse/MECLIPSE-388

Есть два способа установить его: либо вытащить мой измененный код и установить его, либо скачать готовый файл jar и просто добавить его.

Сборка плагина

Запустите maven install из каталога плагинов, который вы извлекли, а затем добавьте следующее в раздел плагинов ваших проектов pom:

<build>
  </plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-eclipse-plugin</artifactId>
      <version>2.8-cpfix</version>
    </plugin>
  </plugins>
</build>

Скачать банку

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

Запустив файл, запустите

mvn install:install-file -Dfile=<path-to-file> -DgroupId=org.apache.maven.plugins \
    -DartifactId=maven-eclipse-plugin -Dversion=2.8-cpfix -Dpackaging=jar

Независимо от того, как вы установили его сейчас при запуске mvn eclipse:eclipse, он подберет измененный код и упорядочит зависимости в соответствии с порядком, который вы определили в файле pom, без алфавитного упорядочения. Это также поместит контейнер JRE в верхнюю часть зависимостей.

Надеюсь, реальная версия этого кода скоро выйдет, но пока что это исправление помогло мне в моем проекте, и я надеюсь, что оно может помочь и другим.

...