Magia o versione del file di classe errata


101

So già che la domanda è stata già posta molto spesso e risponde, ma nessuna delle risposte che ho trovato ha risolto il mio problema.

È l'errore:

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'errore è bad class file magic (cafebabe) or version (0034.0000).

Ho compilato ed eseguito l'applicazione senza problemi molte volte nello stesso giorno, ma ora questo non riesce ogni volta con questo messaggio.


Project SDK è Android API 19 Platforme il livello di progetto è 1.7.

CompileSDK è 19e buildToolsVersion è '20.0.0'.

Opzioni di compilazione:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

e in dependenciesho:

compile files('libs/bananaquery.jar')

La libreria è costruita con SDK Android API 19 Platforma livello di progetto 1.7.

Il mio .jarfile è nella libs/cartella.

Uso IntelliJ IDEA 14 Preview, potrebbe essere il motivo? Con IntellIJ IDEA 13 rimane bloccato su "Gradle sync"

compilare i file potrebbe essere inutile dato che l'ho fatto compile fileTree(dir: 'libs', include: ['*.jar'])anch'io


Salve, ho un problema simile ma mettere il compilatore del progetto a 1.7 non aiuta, per favore puoi dare un'occhiata? stackoverflow.com/questions/29098038/...
Csabi

Il problema potrebbero essere molte cose, ho usato 1.7 perché stavo usando Java 1.7, prova a cambiarlo in 1.6
Marco Acierno

Ciao ho provato l'intero progetto messo a 1.6 non aiuta, stavo usando quella libreria prima, ho appena aggiornato il file .jar con una versione più recente, potrebbe essere un problema che sia compilato con java superiore?
Csabi

Ho seguito il lungo percorso per risolvere questo problema e mi sono reso conto che l'errore di compilazione si stava verificando su una libreria che stavo importando. Questa è una distinzione importante perché nessuna modifica alle impostazioni del compilatore IDE locale risolverà qualcosa che viene importato.
Shadoninja

Risposte:


95

la mia JAVA_HOMEvariabile è cambiata in Java 1.8 e ho ricevuto questo messaggio di errore durante la compilazione di un modulo java puro come dipendenza del mio progetto Android.

build.gradle del modulo java

apply plugin: 'java'

Soluzione # 1: veloce e sporco

L'ho risolto impostando la JAVA_HOMEschiena a 1.7:

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

Soluzione n. 2: cambia la versione del compilatore:

tornare alla 1.7 per questo modulo specifico nel suo build.gradle

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

4
Nella versione sperimentale di Gradle la sintassi è:compileOptions.with { sourceCompatibility=JavaVersion.VERSION_1_7 targetCompatibility=JavaVersion.VERSION_1_7 }
Stephen Kaiser

La soluzione 2 ha funzionato per me, anche se Android Studio ha sottolineato in grigio sourceCompatibility e targetCompatibility dicendo che "L'assegnazione non viene utilizzata"
CodyF

39

Ok, colpa mia.

Nella sezione Project SDK, quando aggiungi un Android SDKdevi fornire Java SDKe tutti i miei Android SDK utilizzano Java 8 come SDK in modo da creare i file di classe con la versione sbagliata anche se il livello di progetto è 1.7(non so perché, suppongo che tutto è stato scelto a livello di progetto).

Ora ho cambiato l'SDK (la java version "1.x.0"parte.)

inserisci qui la descrizione dell'immagine

e sembra compilare bene.

Il motivo che ha funzionato prima di oggi era perché il mio SDK lo era 1.8e non lo eraAndroid API x


Ho lo stesso problema. dove dovrei cambiare questo. Grazie
rupesh

1
Quando aggiungi un SDK Android devi specificare a quale SDK fai riferimento ... (Nel mio caso ho selezionato Java 7 perché stavo usando questa versione) Ma dipende anche dal tuo caso. Cerca online altri errori con lo stesso nome, troverai molte informazioni
Marco Acierno

stai parlando della schermata delle preferenze ??
rupesh

3
Apri la finestra della struttura del progetto> Dov'è la selezione con il messaggio "Project SDK" seleziona l'SDK di cui hai bisogno (il tuo codice o la versione dell'SDK utilizzato per compilare la libreria esterna). Se hai lo stesso problema, controlla la riga dell'SDK Android e fai clic su "Modifica". Verrai spostato in un altro pannello, dove hai Java SDK, seleziona 1.7 (o la versione che devi compilare)
Marco Acierno

2
Risolta la stessa situazione andando su Impostazioni modulo e modificando la posizione JDK nella home directory in cui era installato Java 7 jre
zztonedefzz

27

Nel caso in cui le persone trovino la risposta di @Marco Acierno un po 'poco chiara, la soluzione è assicurarsi di costruire con Java 7 e non con una versione successiva.

Per Android Studio, File -> Project Structure -> SDK Location -> JDK Locationpassa a jdk1.7.x. Per la riga di comando, assicurati che gli java -versionoutput java version "1.7.x".


Stavo usando IntelliJ IDEA quindi nel mio caso ho dovuto mettere il Java SDK corretto quando ho aggiunto l'SDK Android ... (non puoi semplicemente selezionare Java 1.x in un modulo Android altrimenti non vedrà le classi Android)
Marco Acierno

15
Perché non possiamo usare Java 8?
Sujay


3

cambia tutta la versione del tuo modulo java in java 1.7 in ogni file build.grade.

nel plugin che è libreria e applicazione

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

e in java

sourceCompatibility= 1.7
targetCompatibility= 1.7

Questa era l'unica cosa che dovevo fare. Grazie
Chisko

2

Questo problema si verifica quando si utilizza un .jarfile che non utilizza alcuna funzionalità di Java 6 o versioni successive ma che è stato creato utilizzando Java 6 o versioni successive.

Se hai creato quel .jarfile, non è necessario modificare nulla in Gradleo ProGuardo Compiler Version. La soluzione è molto semplice, basta creare di .jarnuovo quel file ma utilizzando Java 5 o meno .

Maggiori dettagli .


nel mio caso è un file .aar. Cosa dovrei fare?
GvSharma

1

Ho avuto un problema simile, l'ho risolto aggiornando il mio programma. ottieni la tua versione di proguard con questo comando

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

ottenere l'ultimo file progaurd.jar da qui ( http://proguard.sourceforge.net )

sostituire l'esistente android-sdks / tools / proguard / lib / proguard.jar con il nuovo file .jar.

Spero che questo ti aiuti. Se si utilizza java 8, è necessario eseguire l'aggiornamento a proguard 5.x poiché proguard 4.x non supporta java 8.


@RookieGuy prova a riportare la versione java alla 1.7, che ha funzionato anche per me.
spaceMonkey

Grazie per il suggerimento, ho dovuto ricompilare le librerie incluse nelle dipendenze transitive, l'ho scritto qui uc-mobileapps.com/index.html%3Fp=509.html come riferimento, poiché le versioni sono cambiate un po '
RookieGuy

1

ha avuto un problema simile quando ho provato ad aggiungere una libreria autoprodotta da netbeans ad Android Studio. L'impostazione della compatibilità sorgente e destinazione in Android Studio e nel formato sorgente / binario in netbeans (entrambi!) su Java 1.7 ha risolto il problema.

in Android Studio:

Struttura del progetto -> Moduli / App -> Propreties -> Source- e Target a 1.7

in netbeans:

File -> Proprietà progetto -> Sorgenti -> Formato sorgente / binario a 1.7

quindi pulisci e crea il tuo progetto netbeans e copia il file .jar da "NBProj / dist" a "app / libs"


0

condividi la soluzione del caso se è installato solo Java8, basta impostare il livello del compilatore Java su 1.7 e quindi ricostruire il progetto dovrebbe essere OK.


0

Ho ricevuto l'errore durante l'utilizzo di una libreria di terze parti. In accordo con la domanda di cui sopra, è stato necessario sostituire la libreria secondo il messaggio di traccia dello stack sopra:

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

con la versione appropriata.

Corrispondente alla domanda, bananaquery.jardeve essere sostituito dalla versione compatibile con Java.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.