Сбой сборки Android maven (eclipse) из-за неожиданного исключения верхнего уровня (с использованием зависимости odata4j)

У меня проблема с созданием проекта Android maven (eclipse m2e, android для maven).

Цель «установить» возобновляется словами:

[INFO] UNEXPECTED TOP-LEVEL EXCEPTION:
[INFO] java.lang.IllegalArgumentException: already added: Ljavax/persistence/Access;
[INFO]  at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)

Я добавил в проект следующую зависимость:

<dependency>
    <groupId>org.odata4j</groupId>
    <artifactId>odata4j-jersey</artifactId>
    <version>0.7.0</version>
</dependency>

Эта зависимость также добавляет (среди прочего) javax.persistence-2.0.0.jar.

Я так понимаю библиотека добавлена ​​дважды? Но как решить эту проблему? Когда я удаляю зависимость, проект может быть построен без ошибок.

Вот вывод команды: зависимость maven: дерево

[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ myapp ---
[INFO] org.subby.android:myapp:apk:0.0.1-SNAPSHOT
[INFO] +- com.google.android:android:jar:4.1.1.4:provided
[INFO] |  +- commons-logging:commons-logging:jar:1.1.1:provided
[INFO] |  +- org.apache.httpcomponents:httpclient:jar:4.0.1:provided
[INFO] |  |  +- org.apache.httpcomponents:httpcore:jar:4.0.1:provided
[INFO] |  |  +- (commons-logging:commons-logging:jar:1.1.1:provided - omitted for  duplicate)
[INFO] |  |  \- commons-codec:commons-codec:jar:1.3:provided
[INFO] |  +- org.khronos:opengl-api:jar:gl1.1-android-2.1_r1:provided
[INFO] |  +- xerces:xmlParserAPIs:jar:2.6.2:provided
[INFO] |  +- xpp3:xpp3:jar:1.1.4c:provided
[INFO] |  \- org.json:json:jar:20080701:provided
[INFO] \- org.odata4j:odata4j-jersey:jar:0.7.0:compile
[INFO]    +- org.odata4j:odata4j-core:jar:0.7.0:compile
[INFO]    |  +- org.core4j:core4j:jar:0.5:compile
[INFO]    |  +- javax.ws.rs:jsr311-api:jar:1.1.1:compile
[INFO]    |  +- org.eclipse.persistence:javax.persistence:jar:2.0.0:compile
[INFO]    |  +- org.eclipse.persistence:eclipselink:jar:2.1.2:compile
[INFO]    |  \- joda-time:joda-time:jar:1.6:compile
[INFO]    +- com.sun.jersey:jersey-core:jar:1.1.5:compile
[INFO]    |  \- (javax.ws.rs:jsr311-api:jar:1.1.1:compile - omitted for duplicate)
[INFO]    +- com.sun.jersey:jersey-server:jar:1.1.5:compile
[INFO]    |  +- (com.sun.jersey:jersey-core:jar:1.1.5:compile - omitted for duplicate)
[INFO]    |  \- asm:asm:jar:3.1:compile
[INFO]    \- com.sun.jersey:jersey-client:jar:1.1.5:compile
[INFO]       \- (com.sun.jersey:jersey-core:jar:1.1.5:compile - omitted for duplicate)

Я делаю что-то неправильно? Я все еще очень новичок в maven.

Спасибо!


person Subby    schedule 24.01.2013    source источник


Ответы (2)


Это происходит потому, что в вашей сборке есть повторяющиеся классы. ADT выдаст s, если ваш путь к классам Eclipse содержит более одного класса с одним и тем же именем/пакетом.

Я бы посоветовал запустить mvn dependency:tree, где вы получите полную картину

[INFO] +- com.sun.jersey:jersey:jar:0.8-ea-SNAPSHOT:compil
[INFO] |  +- javax.ws.rs:jsr311-api:jar:0.8:compile
[INFO] |  \- asm:asm:jar:3.1:compile
[INFO] \- com.sun.jersey:jersey-client:jar:1.9.1:test
[INFO]    \- com.sun.jersey:jersey-core:jar:1.9.1:test

Дубликаты — это некоторые зависимости, которые транзитивно извлекаются из odata4j-jersey. Чтобы исправить их, вы должны добавить что-то вроде этого на дубликаты:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
          <groupId>sample.ProjectB</groupId>
          <artifactId>Project-B</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
  </dependencies>
</project>
person Mite Mitreski    schedule 24.01.2013
comment
Привет и спасибо за ваш ответ. В дереве зависимостей я вижу постоянство javax только один раз. Поэтому я не знаю, откуда взялось второе появление этого класса. Я не совсем уверен, что поставить в исключения. - person Subby; 24.01.2013
comment
не могли бы вы добавить журнал в качестве комментария mvn dependency:tree -Dverbose - person Mite Mitreski; 24.01.2013
comment
Конечно, я добавил вывод зависимостей. - person Subby; 25.01.2013

Я получил решение:

Кажется, две зависимости odata4j:

eclipselink-2.1.2
javax.persistence

имеют некоторые общие классы.

Так что проблема решается, когда исключается та или иная зависимость.

Похоже, это просто проблема с android/adt. Обычно вам не нужно исключать зависимости одного артефакта, не так ли?

Теперь зависимость выглядит так:

<dependency>
    <groupId>org.odata4j</groupId>
    <artifactId>odata4j-core</artifactId>
    <version>0.7.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Большое спасибо Mite за полезную подсказку.

С уважением, Алекс

person Subby    schedule 24.01.2013