2012-09-08 13 views
11

En primer lugar, hay al menos 2 publicaciones con el mismo problema, pero estas soluciones ya no funcionan, al menos no en mi instalación.java.lang.IllegalArgumentException: ya se agregó: Lorg/hamcrest/BaseDescription; La conversión a formato Dalvik falló con el error 1

estoy usando M2e con Eclipse y Android y trató de ejecutar la aplicación como "aplicación Android" seleccionando plazo como-> aplicación de Android, pero siempre me sale este error:

UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.IllegalArgumentException: already added: Lorg/hamcrest/BaseDescription;
. . .

[2012-09-08 19:50:41 - net.mydomain.project-TRUNK] Conversion to Dalvik format failed with error 1

Es es el problema descrito here in Tools R14 section. Antes que nada, esto no se puede arreglar porque tengo este problema en ADT 20.0.3. En segundo lugar, no tengo estas carpetas llamadas "_src". Nunca los había visto en un proyecto de Maven antes, así que no sé qué debería hacer ahora. Ni siquiera tengo bibliotecas vinculadas dos veces. Al menos no veo algunos en mi proyecto. ¿Alguna idea de cómo hacer que esto funcione?

Aquí es mi pom.xml si esto ayuda:

<?xml version="1.0" encoding="UTF-8"?> 
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven- v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>net.devgems.android</groupId> 
    <artifactId>kurzparkzonewien</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>apk</packaging> 
    <name>kurzparkzonewien</name> 

    <properties> 
     <platform.version>1.6_r2</platform.version> 
     <android.sdk.path>/opt/android-sdk-linux</android.sdk.path> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>com.google.android</groupId> 
      <artifactId>android</artifactId> 
      <version>${platform.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>com.googlecode.json-simple</groupId> 
      <artifactId>json-simple</artifactId> 
      <version>1.1.1</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>2.0.1</version> 
     </dependency> 
     <!-- Make sure this is below the android dependencies --> 
     <dependency> 
      <groupId>com.pivotallabs</groupId> 
      <artifactId>robolectric</artifactId> 
      <version>1.0-RC1</version> 
      <scope>test</scope> 
     </dependency> 

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

    <build> 
     <outputDirectory>target/classes</outputDirectory> 
     <testOutputDirectory>target/test-classes</testOutputDirectory> 

     <plugins> 
      <plugin> 
       <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
       <artifactId>android-maven-plugin</artifactId> 
       <version>3.1.1</version> 
       <configuration> 
        <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile> 
        <assetsDirectory>${project.basedir}/assets</assetsDirectory> 
        <resourceDirectory>${project.basedir}/res</resourceDirectory> 
        <nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory> 
        <sdk> 
         <platform>4</platform> 
         <path>${android.sdk.path}</path> 
        </sdk> 
        <undeployBeforeDeploy>true</undeployBeforeDeploy> 
       </configuration> 
       <extensions>true</extensions> 
      </plugin> 

      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    </project> 

Estoy usando Eclipse Juno, ADT 20.0.3, M2e 1.1.0.

Respuesta

12

Encontré la solución. Depende de la versión JUnit, porque JUnit 4.10 agrega la biblioteca JUnit y la biblioteca hamcrest jar, aunque JUnit 4.10 ya contiene todas las clases de hamcrest, por lo que hamcrest existe dos veces. Si cambio de nuevo a JUnit 4.8.1, no agrega hamcrest como biblioteca y el error desaparece.

Esta solución es en realidad una solución. Por lo general, el complemento Eclipse Maven debe manejar esto, pero Hamcrest/JUnit es un problema especial, porque JUnit incluye Hamcrest, no como dependencia, sino como código.

+2

Spot on! En mi caso, estaba tratando de usar ActionBarSherlock 4.2.0 como un proyecto de biblioteca, ¡y eso estaba trayendo JUnit 4.10 como una dependencia de mi proyecto! Cambiar JUnit de 4.10 a 4.8.1 en ActionBarSherlock Library pom.xml lo arregló. ¡Muchas gracias! –

+2

Si desea continuar utilizando 4.10, puede excluir explícitamente el jar de hamcrest como una dependencia transitiva de JUnit. Esta es la manera de hacerlo en Gradle: instrumentTestCompile ('junit: junit: 4.10') { excluyen del grupo: 'org.hamcrest' } Vea aquí el equivalente Maven: http: // experto. apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html – Brendan

1

Desafortunadamente, Eclipse no entiende el alcance de la prueba de Maven. Tira de las clases de hamcrest en la compilación con JUnit 4.10. Use JUnit 4.8.1 o, si realmente necesita usar la versión 4.10+ de JUnit, puede usar un perfil de experto sin el dep de junit en eclipse.

  1. Incluir el dep JUnit en el perfil predeterminado y crear un perfil vacío 'no-junit' (véase el ejemplo pom abajo)
  2. propiedades del proyecto Eclipse> Maven> Perfiles Maven activos: no-junit
  3. manualmente añadir la biblioteca JUnit a la Vía de construcción eclipse de su proyecto

Aquí está la parte correspondiente de la pom.xml:

<profiles> 
    <profile> 
     <id>default</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <dependencies> 
      <dependency> 
       <groupId>junit</groupId> 
       <artifactId>junit</artifactId> 
       <version>4.10</version> 
       <scope>test</scope> 
      </dependency> 
     </dependencies> 
    </profile> 
    <profile> 
     <id>no-junit</id> 
    </profile> 
</profiles> 
+1

El punto 3 es una muy mala idea. Este es un proyecto de Maven, por lo que Maven tiene que administrar el proyecto en sí. Si comienza a agregar bibliotecas manualmente, nadie puede reproducir lo que ha hecho. – Bevor

13

Probé las soluciones anteriores y todavía recibí el error. Solo después de un poco más de prueba y error descubrí que las clases de hamcrest también están contenidas en otro jar: mockito (aún no sabía que el mockito no funcionaría con mis pruebas de instrumentación)

Así que resolví mi problema eliminando Mockito-all.jar de mis dependencias y hamcrest excluidos de las dependencias transitivas de JUnit como este:

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <scope>test</scope> 
    <version>4.10</version> 
    <exclusions> 
     <exclusion> 
      <artifactId>hamcrest-core</artifactId> 
      <groupId>org.hamcrest</groupId> 
     </exclusion> 
    </exclusions> 
    </dependency> 

esta exclusión también puede ser necesaria para commons-logging (a partir de la fecha de la escritura), porque de lo contrario el constructor de apk protestará por las viejas clases.

+0

gracias amigo - ¡eso lo hizo por mí! :) – martyglaubitz

+0

La única solución que se ajusta a mis necesidades. He visitado todos los enlaces en Google y nada. Gracias. – tomrozb

+1

Por https://code.google.com/p/mockito/wiki/DeclaringMockitoDependency#mockito-core_VS_mockito-all Acabo de cambiar la dependencia de mockito-all a mockito-core, que efectivamente hizo lo mismo con la eliminación de hamcrest-core de ser incluido con mockito, pero sin tener que agregar la exclusión. –

Cuestiones relacionadas