Magia o versión de archivo de clase incorrecta


101

Ya sé que esa pregunta ya se ha hecho con mucha frecuencia y las respuestas, pero ninguna de las respuestas que encontré solucionó mi problema.

Es el error:

Error:Gradle: Execution failed for task ':ffcommunity:preDexDebug'.
 com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    D:\Android SDK\sdk\build-tools\20.0.0\dx.bat --dex --output D:\Users\ReVo\Documents\IntelliJ IDEA\FFCommunity\ffcommunity\build\intermediates\pre-dexed\debug\bananaquery-2ee85432877a057e7414910b8127805535139d5d.jar D:\Users\ReVo\Documents\IntelliJ IDEA\FFCommunity\ffcommunity\libs\bananaquery.jar
Error Code:
    1
Output:
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
        at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
        at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
        at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
        at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
        at com.android.dx.command.dexer.Main.processClass(Main.java:665)
        at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634)
        at com.android.dx.command.dexer.Main.access$600(Main.java:78)
        at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572)
        at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
        at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
        at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
        at com.android.dx.command.dexer.Main.processOne(Main.java:596)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264)
        at com.android.dx.command.dexer.Main.run(Main.java:230)
        at com.android.dx.command.dexer.Main.main(Main.java:199)
        at com.android.dx.command.Main.main(Main.java:103)
    ...while parsing com/comuf/revonline/bananaquery/BananaInsert.class
    1 error; aborting

El error es bad class file magic (cafebabe) or version (0034.0000).

Construí y ejecuté la aplicación sin problemas muchas veces en el mismo día, pero ahora esto falla cada vez con este mensaje.


Project SDK es Android API 19 Platformy el nivel de proyecto es 1.7.

CompileSDK es 19y buildToolsVersion es '20.0.0'.

Opciones de compilación:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

y en dependenciestengo:

compile files('libs/bananaquery.jar')

La biblioteca está construida con SDK Android API 19 Platformcon nivel de proyecto 1.7.

Mi .jararchivo está dentro de la libs/carpeta.

Utilizo IntelliJ IDEA 14 Preview, ¿podría ser la razón? Con IntellIJ IDEA 13, permanece bloqueado en "Gradle sync"

compilar archivos podría ser inútil ya que yo compile fileTree(dir: 'libs', include: ['*.jar'])también


Hola, tengo un problema similar, pero poner el compilador del proyecto en 1.7 no ayuda, ¿puedes echar un vistazo? stackoverflow.com/questions/29098038/…
Csabi

El problema podría ser muchas cosas, usé 1.7 porque estaba usando Java 1.7, intente cambiarlo a 1.6
Marco Acierno

Hola, intenté poner todo el proyecto en 1.6, no ayuda, estaba usando esa biblioteca antes, acabo de actualizar el archivo .jar con una versión más nueva, ¿podría ser un problema que esté compilado con una versión superior de Java?
Csabi

Seguí el largo camino para solucionar este problema y me di cuenta de que el error de compilación se estaba produciendo en una biblioteca que estaba importando. Esta es una distinción importante porque ningún cambio en la configuración del compilador IDE local solucionará algo que se está importando.
Shadoninja

Respuestas:


95

mi JAVA_HOMEvariable cambió a Java 1.8 y recibí este mensaje de error al compilar un módulo java puro como una dependencia de mi proyecto de Android.

build.gradle del módulo java

apply plugin: 'java'

Solución # 1: Rápido y sucio

Lo arreglé poniendo mi JAVA_HOMEespalda en 1.7:

export JAVA_HOME=`/usr/libexec/java_home -v 1.7`

Solución # 2: cambie la versión del compilador:

cambie de nuevo a 1.7 para este módulo específico en su build.gradle

apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7

4
En la versión experimental de Gradle, la sintaxis es:compileOptions.with { sourceCompatibility=JavaVersion.VERSION_1_7 targetCompatibility=JavaVersion.VERSION_1_7 }
Stephen Kaiser

La solución 2 funcionó para mí, a pesar de que Android Studio subrayó en gris el sourceCompatibility y targetCompatibility diciendo que "Assignment is not used"
CodyF

39

Ok, mi mal.

En la sección Project SDK, cuando agrega un Android SDK, debe proporcionar el Java SDKy todos mis Android SDK usan Java 8 como SDK, por lo que crea los archivos de clase con la versión incorrecta, incluso si el nivel del proyecto es 1.7(no sé por qué, supuse que todo fue elegido por nivel de Proyecto).

Ahora cambié el SDK (la java version "1.x.0"parte).

ingrese la descripción de la imagen aquí

y parece compilarse bien.

La razón que funcionó antes de hoy fue porque mi SDK era 1.8y noAndroid API x


Tengo el mismo problema. ¿Dónde se supone que debo cambiar esto? Gracias
rupesh

1
Cuando agrega un SDK de Android, debe especificar a qué SDK se refiere ... (En mi caso, seleccioné Java 7 porque estaba usando esta versión) Pero también depende de su caso. Busque en línea otros errores con el mismo nombre, encontrará mucha información
Marco Acierno

¿Estás hablando de la pantalla de preferencias?
rupesh

3
Abra la ventana de estructura del proyecto> ¿Dónde está la selección con el mensaje "Project SDK", seleccione el SDK que necesita (su código o la versión del SDK utilizada para compilar la biblioteca externa). Si tiene mi mismo problema, verifique la línea del SDK de Android y haga clic en "Editar". Serás trasladado a otro panel, donde tienes Java SDK, selecciona 1.7 (o la versión que necesitas compilar)
Marco Acierno

2
Se corrigió la misma situación yendo a Configuración del módulo y editando la ubicación de JDK en el directorio de inicio donde se instaló un jre de Java 7
zztonedefzz

27

En caso de que las personas encuentren que la respuesta de @Marco Acierno no está clara, la solución es asegurarse de que está compilando con Java 7 y no con una versión superior.

Para Android Studio, cambie File -> Project Structure -> SDK Location -> JDK Locationa jdk1.7.x. Para la línea de comando, asegure las java -versionsalidas java version "1.7.x".


Estaba usando IntelliJ IDEA, así que en mi caso tuve que poner el SDK de Java correcto cuando agregué el SDK de Android ... (no puede simplemente seleccionar Java 1.x en un módulo de Android, de lo contrario no verá las clases de Android)
Marco Acierno

15
¿Por qué no podemos usar java 8?
Sujay


3

cambie toda la versión de Java del módulo a java 1.7 en cada archivo build.grade.

en el complemento que es biblioteca y aplicación

compileOptions{
    sourceCompatibility=JavaVersion.VERSION_1_7
    targetCompatibility=JavaVersion.VERSION_1_7
}

y en java

sourceCompatibility= 1.7
targetCompatibility= 1.7

Esto era lo único que necesitaba hacer. Gracias
Chisko

2

Este problema ocurre cuando usa un .jar archivo que no utiliza ninguna función de Java 6 o superior, pero que se creó con Java 6 o superior.

Si creó ese .jararchivo, entonces no necesita cambiar nada en Gradleo ProGuardo Compiler Version. La solución es muy simple, simplemente compile ese .jararchivo nuevamente pero usando Java 5 o menos .

Más detalles .


en mi caso es un archivo .aar. ¿Qué tengo que hacer?
GvSharma

1

Tuve un problema similar, lo resolví actualizando mi proguard. obtenga su versión proguard con este comando

java -jar ~/android-sdks/tools/proguard/lib/proguard.jar 

obtenga el último archivo progaurd.jar desde aquí ( http://proguard.sourceforge.net )

reemplace el archivo android-sdks / tools / proguard / lib / proguard.jar existente con un nuevo archivo .jar.

Espero que esto te ayude. Si usa java 8, debería actualizar a proguard 5.x porque proguard 4.x no es compatible con java 8.


@RookieGuy intente volver a configurar la versión de Java en 1.7, eso también funcionó para mí.
spaceMonkey

Gracias por la pista, tuve que volver a compilar las bibliotecas que se incluyeron con dependencias transitivas, lo escribí aquí uc-mobileapps.com/index.html%3Fp=509.html como referencia, ya que las versiones han cambiado bastante
RookieGuy

1

Tuve un problema similar cuando intenté agregar una biblioteca de netbeans a Android Studio. la configuración de la compatibilidad de origen y destino en android studio y el formato de origen / binario en netbeans (¡ambos!) en java 1.7 resolvió el problema.

en Android Studio:

Estructura del proyecto -> Módulos / Aplicación -> Propiedades -> Fuente y destino a 1.7

en netbeans:

Archivo -> Propiedades del proyecto -> Fuentes -> Formato fuente / binario a 1.7

luego limpie y construya su proyecto netbeans y copie el .jar de "NBProj / dist" a "app / libs"


0

comparta la solución del caso si solo está instalado Java8, simplemente configure el nivel del compilador de Java en 1.7 y luego reconstruya el proyecto debería estar bien.


0

Recibí el error al usar una biblioteca de terceros. De acuerdo con la pregunta mencionada anteriormente, fue necesario reemplazar la biblioteca de acuerdo con el mensaje de seguimiento de pila anterior:

        ...
    ...while parsing com/comuf/revonline/bananaquery/BananaInsert.class
    ...

con la versión apropiada.

De acuerdo con la pregunta, bananaquery.jarse reemplazará por la versión compatible con Java.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.