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

Marco Acierno
fuente
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
pasivo
fuente
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

Marco Acierno
fuente
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".

Chris Lacy
fuente
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
5

Establecer JAVA_HOME de nuevo a 1.7 funcionó para mí.

Vishal Singh
fuente
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
baiiu
fuente
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 .

Suceden errores
fuente
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.

mono espacial
fuente
@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"

RickPat
fuente
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.

suiwenfeng
fuente
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.

gotwo
fuente