Mauvais fichier de classe magique ou version

101

Je sais déjà que cette question a déjà été posée très souvent et que des réponses ont été apportées, mais aucune des réponses que j'ai trouvées n'a résolu mon problème.

C'est l'erreur:

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

L'erreur est bad class file magic (cafebabe) or version (0034.0000).

J'ai construit et exécuté l'application sans problème plusieurs fois dans la même journée, mais maintenant cela échoue à chaque fois avec ce message.


Le SDK du projet est Android API 19 Platformet le niveau du projet est 1.7.

CompileSDK est 19et buildToolsVersion est '20.0.0'.

Options de compilation:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

et dans dependenciesj'ai:

compile files('libs/bananaquery.jar')

La bibliothèque est construite avec le SDK Android API 19 Platformau niveau du projet 1.7.

Mon .jarfichier est dans le libs/dossier.

J'utilise IntelliJ IDEA 14 Preview, cela pourrait être la raison? Avec IntellIJ IDEA 13, il reste bloqué à "Gradle sync"

compiler des fichiers pourrait être inutile puisque moi compile fileTree(dir: 'libs', include: ['*.jar'])aussi

Marco Acierno
la source
Salut j'ai un problème similaire mais mettre le compilateur de projet à 1.7 n'aide pas, pouvez-vous jeter un oeil? stackoverflow.com/questions/29098038/…
Csabi
Le problème ça pourrait être beaucoup de choses, j'ai utilisé 1.7 parce que j'utilisais Java 1.7, essayez de le changer en 1.6
Marco Acierno
Salut, j'ai essayé l'ensemble du projet mis à 1.6 cela n'aide pas, j'utilisais cette bibliothèque avant, je viens de mettre à jour le fichier .jar avec une version plus récente, cela pourrait être un problème qu'il soit compilé avec un java supérieur?
Csabi
J'ai suivi le long chemin pour résoudre ce problème et j'ai réalisé que l'erreur de compilation se produisait sur une bibliothèque que j'importais. C'est une distinction importante car aucune modification des paramètres du compilateur IDE local ne corrigera quelque chose qui est importé.
Shadoninja

Réponses:

95

ma JAVA_HOMEvariable est passée à Java 1.8 et j'ai reçu ce message d'erreur lors de la compilation d'un module java pur en tant que dépendance de mon projet Android.

build.gradle du module java

apply plugin: 'java'

Solution n ° 1: rapide et sale

Je l'ai corrigé en réglant mon JAVA_HOMEdos à 1,7:

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

Solution n ° 2: changer la version du compilateur:

revenir à 1.7 pour ce module spécifique dans sa build.gradle

apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
passsy
la source
4
Dans la version expérimentale de Gradle, la syntaxe est:compileOptions.with { sourceCompatibility=JavaVersion.VERSION_1_7 targetCompatibility=JavaVersion.VERSION_1_7 }
Stephen Kaiser
La solution 2 a fonctionné pour moi, même si Android Studio a souligné en gris la sourceCompatibility et la targetCompatibility en disant que "L'assignation n'est pas utilisée"
CodyF
39

Ok, mon mauvais.

Dans la section Project SDK, lorsque vous ajoutez un, Android SDKvous devez fournir le Java SDKet tous mes SDK Android utilisent Java 8 comme SDK afin de créer les fichiers de classe avec la mauvaise version même si le niveau du projet est 1.7(je ne sais pas pourquoi, je suppose que tout a été choisi par niveau de projet).

Maintenant, j'ai changé le SDK (la java version "1.x.0"partie.)

entrez la description de l'image ici

et il semble bien compiler.

La raison qui fonctionnait avant aujourd'hui était que mon SDK était 1.8et nonAndroid API x

Marco Acierno
la source
J'ai le même problème. où devrais-je supposé changer cela. Merci
rupesh
1
Lorsque vous ajoutez un SDK Android, vous devez spécifier à quel SDK vous vous référez ... (Dans mon cas, j'ai sélectionné Java 7 car j'utilisais cette version) Mais cela dépend aussi dans votre cas. Recherchez en ligne d'autres erreurs avec le même nom, vous trouverez beaucoup d'informations
Marco Acierno
parlez-vous de l'écran des préférences ??
rupesh
3
Ouvrez la fenêtre de structure du projet> Où se trouve la sélection avec le message "Project SDK" sélectionnez le SDK dont vous avez besoin (votre code ou la version du SDK utilisé pour compiler la bibliothèque externe). Si vous rencontrez le même problème, vérifiez la ligne de votre SDK Android et cliquez sur "Modifier". Vous serez déplacé vers un autre panneau, où vous avez Java SDK, sélectionnez 1.7 (ou la version que vous devez compiler)
Marco Acierno
2
Correction de la même situation en accédant aux paramètres du module et en modifiant l'emplacement JDK dans le répertoire de base où un jre Java 7 était installé
zztonedefzz
27

Au cas où les gens trouveraient la réponse de @Marco Acierno un peu floue, la solution est de s'assurer que vous construisez avec Java 7 et non avec une version supérieure.

Pour Android Studio, passez File -> Project Structure -> SDK Location -> JDK Locationà jdk1.7.x. Pour la ligne de commande, assurez les java -versionsorties java version "1.7.x".

Chris Lacy
la source
J'utilisais IntelliJ IDEA, donc dans mon cas, j'ai dû mettre le bon SDK Java lorsque j'ai ajouté le SDK Android ... (vous ne pouvez pas simplement sélectionner Java 1.x dans un module Android, sinon il ne verra pas les classes Android)
Marco Acierno
15
Pourquoi ne pouvons-nous pas utiliser Java 8?
Sujay
5

La définition de JAVA_HOME sur 1.7 a fonctionné pour moi.

Vishal Singh
la source
3

changez toute la version java de votre module en java 1.7 dans chaque fichier build.grade.

dans le plugin qui est bibliothèque et application

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

et en java

sourceCompatibility= 1.7
targetCompatibility= 1.7
baiiu
la source
C'était la seule chose que j'avais à faire. Merci
Chisko
2

Ce problème se produit lorsque vous utilisez un .jarfichier qui n'utilise aucune fonctionnalité de Java 6 ou version ultérieure, mais qui a été créé à l'aide de Java 6 ou version ultérieure.

Si vous avez créé ce .jarfichier, vous n'avez rien à modifier dans Gradleou ProGuardou Compiler Version. La solution est très simple, il suffit de recréer ce .jarfichier mais en utilisant Java 5 ou moins .

Plus de détails .

Des bugs se produisent
la source
dans mon cas, c'est un fichier .aar. Que devrais-je faire?
GvSharma
1

J'ai eu un problème similaire, je l'ai résolu en mettant à jour mon proguard. obtenez votre version proguard par cette commande

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

obtenir le dernier fichier progaurd.jar à partir d'ici ( http://proguard.sourceforge.net )

remplacez le fichier android-sdks / tools / proguard / lib / proguard.jar existant par un nouveau fichier .jar.

J'espère que cela devrait vous aider. Si vous utilisez java 8, vous devez effectuer une mise à niveau vers proguard 5.x coz proguard 4.x ne prend pas en charge java 8.

espaceMonkey
la source
@RookieGuy essayez de remettre la version java à 1.7, cela a également fonctionné pour moi.
spaceMonkey
Merci pour l'indice, j'ai dû recompiler les bibliothèques qui étaient incluses avec les dépendances transitives, je l'ai écrit ici uc-mobileapps.com/index.html%3Fp=509.html pour référence, car les versions ont beaucoup changé
RookieGuy
1

eu un problème similaire lorsque j'ai essayé d'ajouter une bibliothèque auto-créée de netbeans à android studio. la configuration de la compatibilité source et cible dans le studio Android et le format source / binaire dans netbeans (les deux!) sur java 1.7 a résolu le problème.

dans le studio Android:

Structure du projet -> Modules / App -> Propriétés -> Source et cible à 1.7

dans netbeans:

Fichier -> Propriétés du projet -> Sources -> Format source / binaire à 1.7

puis nettoyez et compilez votre projet netbeans et copiez le .jar de "NBProj / dist" vers "app / libs"

RickPat
la source
0

Partagez la solution du cas si seul Java8 est installé, définissez simplement le niveau du compilateur Java sur 1.7, puis reconstruisez le projet devrait être OK.

suiwenfeng
la source
0

J'ai eu l'erreur lors de l'utilisation d'une bibliothèque tierce. Conformément à la question susmentionnée, il était nécessaire de remplacer la bibliothèque conformément au message de trace de pile ci-dessus:

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

avec la version appropriée.

Correspondant à la question, bananaquery.jardoit être remplacé par la version compatible Java.

gotwo
la source