Maven: несколько классов с одинаковым путем реализованы в разных банках - PullRequest
6 голосов
/ 10 апреля 2010

У меня проблемы с наличием нескольких классов с одним и тем же путем (то есть одно и то же имя, один и тот же пакет !!!). По некоторым причинам, gwt-dev поставляется с собственной версией org.apache.xerces.jaxp.DocumentBuilderFactoryImpl и javax.xml.parsers.DocumentBuilderFactory.

В то же время весна также зависит от этих классов, но от разных банок. Я не знаю, что должно быть, но похоже, что xalan & xml-api - это две зависимости, от которых зависит пружина (эти зависимости являются необязательными)

Забавно, что Eclipse может без проблем запускать один и тот же код (это юнит-тест), но точно не может. Так что я думаю, что проблема в том, как каждый бегун учитывает приоритет каждой банки.

Теперь перейдем к вопросу: как я могу настроить свой POM, чтобы я мог быть уверен, что когда-нибудь в моем приложении будет выполняться код, тогда класс из jar будет выбираться поверх класса из другого jar?

Спасибо.

Ответы [ 3 ]

15 голосов
/ 10 апреля 2010

Теперь перейдем к вопросу: как я могу настроить свой POM, чтобы я мог быть уверен, что когда-нибудь в моем приложении будет выполняться код, тогда класс из jar будет выбираться поверх класса из другого jar?

Начиная с Maven 2.0.9, Maven использует порядок зависимостей в POM для создания пути к классам, чтобы вы могли манипулировать им. Просто сначала объявите «правильный» сосуд, и ваше приложение выберет из него класс.

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

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

0 голосов
/ 10 апреля 2010

Чтобы узнать, какой jar вызывает у вас проблемы: запустите Maven с флагом -X.

Чтобы настроить POM для исключения соответствующих банок:

<yourproject.deployment.excludes>
  artifactId1,artifactId2,...
</yourproject.deployment.excludes>

...

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <id>copy-dependencies</id>
        <phase>package</phase>
        <goals>
          <goal>copy-dependencies</goal>
        </goals>
        <configuration>
          <outputDirectory>${your.lib.for.example}</outputDirectory>
          <overWriteSnapshots>true</overWriteSnapshots>
          <overWriteIfNewer>true</overWriteIfNewer>
          <excludeTransitive>false</excludeTransitive>
          <excludeArtifactIds>${yourproject.deployment.excludes}</excludeArtifactIds>
          <includeScope>compile</includeScope>
        </configuration>
      </execution>
    </executions>
  </plugin>
0 голосов
/ 10 апреля 2010

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

  • зависимость mvn: дерево от вашего проекта, чтобы узнать, кто имеет зависимость от классов, вызывающих у вас проблемы.
  • попробуйте исключая классы, которые, по вашему мнению, создают проблемы, отредактировав ваш pom.xml.

надеюсь, это поможет!

...