Schlechte Klassendateimagie oder Version


101

Ich weiß bereits, dass diese Frage bereits sehr oft gestellt und beantwortet wurde, aber keine der Antworten, die ich gefunden habe, hat mein Problem behoben.

Es ist der Fehler:

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

Der Fehler ist bad class file magic (cafebabe) or version (0034.0000).

Ich habe die Anwendung viele Male am selben Tag ohne Probleme erstellt und ausgeführt, aber jetzt schlägt dies jedes Mal mit dieser Nachricht fehl.


Projekt SDK ist Android API 19 Platformund Projektebene ist 1.7.

CompileSDK ist 19und buildToolsVersion ist '20.0.0'.

Kompilierungsoptionen:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

und in dependenciesich habe:

compile files('libs/bananaquery.jar')

Die Bibliothek wird mit SDK Android API 19 Platformauf Projektebene erstellt 1.7.

Meine .jarDatei befindet sich im libs/Ordner.

Ich benutze IntelliJ IDEA 14 Preview, könnte es der Grund sein? Mit IntellIJ IDEA 13 bleibt es bei "Gradle Sync"

Dateien kompilieren könnte nutzlos sein, da ich auch compile fileTree(dir: 'libs', include: ['*.jar'])habe


Hallo, ich habe ein ähnliches Problem, aber es hilft nicht, den Projekt-Compiler auf 1.7 zu setzen. Können Sie bitte einen Blick darauf werfen? stackoverflow.com/questions/29098038/…
Csabi

Das Problem, es könnte eine Menge Dinge sein, ich habe 1.7 verwendet, weil ich Java 1.7 verwendet habe, versuchen Sie es auf 1.6 zu ändern
Marco Acierno

Hallo, ich habe versucht, das gesamte Projekt auf 1.6 zu setzen. Es hilft nicht. Ich habe diese Bibliothek zuvor verwendet. Ich habe gerade die JAR-Datei mit einer neueren Version aktualisiert. Könnte es ein Problem sein, dass sie mit höherem Java kompiliert wurde?
Csabi

Ich habe den langen Weg zur Behebung dieses Problems zurückgelegt und festgestellt, dass der Kompilierungsfehler in einer Bibliothek aufgetreten ist, die ich importiert habe. Dies ist ein wichtiger Unterschied, da keine Änderungen der Einstellungen des lokalen IDE-Compilers das Problem beheben, das importiert wird.
Shadoninja

Antworten:


95

Meine JAVA_HOMEVariable wurde in Java 1.8 geändert und ich erhielt diese Fehlermeldung beim Kompilieren eines reinen Java-Moduls als Abhängigkeit von meinem Android-Projekt.

build.gradle des Java-Moduls

apply plugin: 'java'

Lösung 1: Schnell und schmutzig

Ich habe es behoben, indem ich meinen JAVA_HOMERücken auf 1,7 gesetzt habe:

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

Lösung 2: Compilerversion ändern:

Wechseln Sie in diesem build.gradle für dieses spezielle Modul zurück zu 1.7

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

4
In der experimentellen Version von Gradle lautet die Syntax:compileOptions.with { sourceCompatibility=JavaVersion.VERSION_1_7 targetCompatibility=JavaVersion.VERSION_1_7 }
Stephen Kaiser

Lösung 2 funktionierte für mich, obwohl Android Studio die Quellkompatibilität und die Zielkompatibilität grau unterstrichen hat und sagte, dass "Zuweisung wird nicht verwendet"
CodyF

39

Ok, mein schlechtes.

Wenn Sie im Abschnitt "Projekt-SDK" ein hinzufügen Android SDK, sollten Sie das bereitstellen, Java SDKund alle meine Android-SDKs verwenden Java 8 als SDK, damit die Klassendateien mit der falschen Version erstellt werden, auch wenn die Projektebene aktiviert ist 1.7(ich weiß nicht, warum, vermutete ich) dass alles nach Projektebene ausgewählt wurde).

Jetzt habe ich das SDK (das java version "1.x.0"Teil) geändert .

Geben Sie hier die Bildbeschreibung ein

und es scheint gut zu kompilieren.

Der Grund, der vor heute funktionierte, war, dass mein SDK war 1.8und nichtAndroid API x


Ich habe das gleiche Problem. wo soll ich das ändern. Danke
Rupesh

1
Wenn Sie ein Android SDK hinzufügen, sollten Sie angeben, auf welches SDK Sie verweisen ... (In meinem Fall habe ich Java 7 ausgewählt, weil ich diese Version verwendet habe.) Dies hängt jedoch auch in Ihrem Fall ab. Suchen Sie online nach anderen Fehlern mit dem gleichen Namen, Sie werden viele Informationen finden
Marco Acierno

Sprechen Sie über Einstellungen Bildschirm?
Rupesh

3
Fenster Projektstruktur öffnen> Wo ist die Auswahl mit der Meldung "Projekt-SDK"? Wählen Sie das SDK aus, das Sie benötigen (Ihren Code oder die Version des SDK, die zum Kompilieren der externen Bibliothek verwendet wird). Wenn Sie das gleiche Problem haben, überprüfen Sie Ihre Android SDK-Zeile und klicken Sie auf "Bearbeiten". Sie werden zu einem anderen Bereich verschoben, in dem Sie über Java SDK verfügen.
Wählen

2
Die gleiche Situation wurde behoben, indem Sie zu den Moduleinstellungen gingen und den JDK-Speicherort in das Ausgangsverzeichnis bearbeiteten, in dem ein Java 7 jre installiert war
zztonedefzz

27

Für den Fall, dass die Antwort von @Marco Acierno etwas unklar ist, besteht die Lösung darin, sicherzustellen, dass Sie mit Java 7 und nicht mit einer höheren Version erstellen.

Wechseln Sie für Android Studio File -> Project Structure -> SDK Location -> JDK Locationzu jdk1.7.x. Stellen Sie für die Befehlszeile die java -versionAusgaben sicher java version "1.7.x".


Ich habe IntelliJ IDEA verwendet, daher musste ich in meinem Fall das richtige Java SDK eingeben, als ich das Android SDK hinzufügte ... (Sie können nicht einfach Java 1.x in einem Android-Modul auswählen, da sonst keine Android-Klassen angezeigt werden)
Marco Acierno

15
Warum können wir Java 8 nicht verwenden?
Sujay


3

Ändern Sie in jeder build.grade-Datei die gesamte Java-Version Ihres Moduls in Java 1.7.

im Plugin, das Bibliothek und Anwendung ist

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

und in Java

sourceCompatibility= 1.7
targetCompatibility= 1.7

Dies war das einzige, was ich tun musste. Danke
Chisko

2

Dieses Problem tritt auf, wenn Sie eine .jarDatei verwenden, die keine Funktion von Java 6 oder höher verwendet, aber mit Java 6 oder höher erstellt wurde.

Wenn Sie diese .jarDatei erstellt haben, müssen Sie in Gradleoder ProGuardoder nichts ändern Compiler Version. Die Lösung ist sehr einfach. Erstellen Sie diese .jarDatei einfach erneut, verwenden Sie jedoch Java 5 oder weniger .

Weitere Details .


In meinem Fall handelt es sich um eine .aar-Datei. Was soll ich machen?
GvSharma

1

Ich hatte ein ähnliches Problem, das ich durch ein Upgrade meines Proguards gelöst habe. Holen Sie sich Ihre Proguard-Version mit diesem Befehl

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

Hier erhalten Sie die neueste Datei progaurd.jar ( http://proguard.sourceforge.net ).

Ersetzen Sie die vorhandene android-sdks / tools / proguard / lib / proguard.jar durch eine neue .jar-Datei.

Hoffentlich sollte dir das helfen. Wenn Sie Java 8 verwenden, sollten Sie ein Upgrade auf Proguard 5.x durchführen, da Proguard 4.x Java 8 nicht unterstützt.


@RookieGuy versuche die Java-Version auf 1.7 zurückzusetzen, das hat auch bei mir funktioniert.
spaceMonkey

Vielen Dank für den Hinweis, ich musste Bibliotheken neu kompilieren, die in transitiven Abhängigkeiten enthalten waren. Ich habe sie hier als Referenz geschrieben: uc-mobileapps.com/index.html%3Fp=509.html , da sich die Versionen ziemlich verändert haben
RookieGuy,

1

hatte ein ähnliches Problem, als ich versuchte, eine selbst erstellte Bibliothek von NetBeans zu Android Studio hinzuzufügen. Das Setzen der Quell- und Zielkompatibilität in Android Studio und des Quell- / Binärformats in Netbeans (beide!) auf Java 1.7 löste das Problem.

im Android Studio:

Projektstruktur -> Module / App -> Propreties -> Source- und Target to 1.7

in Netbeans:

Datei -> Projekteigenschaften -> Quellen -> Quell- / Binärformat auf 1.7

Bereinigen und erstellen Sie dann Ihr NetBeans-Projekt und kopieren Sie die JAR-Datei von "NBProj / dist" nach "app / libs".


0

Teilen Sie die Lösung des Falls, wenn nur Java8 installiert ist. Setzen Sie einfach die Java-Compiler-Ebene auf 1.7 und erstellen Sie das Projekt neu.


0

Ich habe den Fehler bei der Verwendung einer Bibliothek eines Drittanbieters erhalten. In Übereinstimmung mit der oben genannten Frage war es notwendig, die Bibliothek gemäß der obigen Stapelverfolgungsnachricht zu ersetzen:

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

mit der entsprechenden Version.

Entsprechend der Frage bananaquery.jarsoll durch die Java-kompatible Version ersetzt werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.