Zła magia lub wersja pliku klasy

101

Wiem już, że pytanie było już zadawane bardzo często i odpowiedzi, ale żadna z odpowiedzi, które znalazłem, nie rozwiązała mojego problemu.

To jest błąd:

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

Błąd jest bad class file magic (cafebabe) or version (0034.0000).

Zbudowałem i uruchomiłem aplikację bez problemów wiele razy w tym samym dniu, ale teraz kończy się to niepowodzeniem z tym komunikatem.


Projekt SDK jest, Android API 19 Platforma poziom projektu to 1.7.

CompileSDK to, 19a buildToolsVersion to '20.0.0'.

Opcje kompilacji:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

i dependenciesmam:

compile files('libs/bananaquery.jar')

Biblioteka jest budowana za pomocą SDK na Android API 19 Platformpoziomie projektu 1.7.

Mój .jarplik znajduje się w libs/folderze.

Używam IntelliJ IDEA 14 Preview, to może być powód? Dzięki IntellIJ IDEA 13 utknął w „synchronizacji Gradle”

Pliki kompilacji mogą być bezużyteczne, ponieważ ja compile fileTree(dir: 'libs', include: ['*.jar'])też

Marco Acierno
źródło
Witam mam podobny problem, ale umieszczenie kompilatora projektu w wersji 1.7 nie pomaga, czy możesz rzucić okiem? stackoverflow.com/questions/29098038/…
Csabi
Problem może być wiele rzeczy, użyłem 1.7 ponieważ używałem Javy 1.7, spróbuj zmienić ją na 1.6
Marco Acierno
Witam wypróbowałem cały projekt wrzucony do 1.6 to nic nie pomaga, wcześniej korzystałem z tej biblioteki, właśnie zaktualizowałem plik .jar o nowszą wersję, może być problem, że jest skompilowany z wyższą wersją java?
Csabi
Przeszedłem długą drogę rozwiązania tego problemu i zdałem sobie sprawę, że w importowanej bibliotece występuje błąd kompilacji. Jest to ważna różnica, ponieważ żadne zmiany ustawień lokalnego kompilatora IDE nie naprawią importowanego elementu.
Shadoninja

Odpowiedzi:

95

moja JAVA_HOMEzmienna została zmieniona na Java 1.8 i otrzymałem ten komunikat o błędzie podczas kompilowania czystego modułu Java jako zależność mojego projektu na Androida.

build.gradle modułu java

apply plugin: 'java'

Rozwiązanie 1: Szybko i brudno

Naprawiłem to, ustawiając JAVA_HOMEplecy na 1.7:

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

Rozwiązanie nr 2: Zmień wersję kompilatora:

Zmień z powrotem na 1.7 dla tego konkretnego modułu w jego build.gradle

apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
passsy
źródło
4
W eksperymentalnej wersji Gradle składnia jest następująca:compileOptions.with { sourceCompatibility=JavaVersion.VERSION_1_7 targetCompatibility=JavaVersion.VERSION_1_7 }
Stephen Kaiser
Rozwiązanie 2 zadziałało dla mnie, mimo że Android Studio podkreślił szaro sourceCompatibility i targetCompatibility, mówiąc, że „Assignment is not used”
CodyF
39

Ok, moja wina.

W sekcji Project SDK, kiedy dodajesz a Android SDK, powinieneś podać, Java SDKa wszystkie moje Android SDK używają Java 8 jako SDK, więc tworzy pliki klas z niewłaściwą wersją, nawet jeśli poziom projektu to 1.7(nie wiem dlaczego, przypuszczałem że wszystko zostało wybrane na poziomie projektu).

Teraz zmieniłem SDK ( java version "1.x.0"część.)

wprowadź opis obrazu tutaj

i wydaje się, że kompiluje się dobrze.

Powodem, który działał wcześniej, było to, że mój SDK był 1.8i nieAndroid API x

Marco Acierno
źródło
mam ten sam problem. gdzie powinienem to zmienić. Dzięki
rupesh
1
Dodając Android SDK, powinieneś określić, do którego SDK się odnosisz ... (W moim przypadku wybrałem Java 7, ponieważ używałem tej wersji) Ale to zależy również w twoim przypadku. Wyszukaj w Internecie inne błędy o tej samej nazwie, znajdziesz wiele informacji
Marco Acierno
mówisz o ekranie preferencji?
rupesh
3
Otwórz okno struktury projektu> Gdzie jest wybór z komunikatem „Project SDK”, wybierz SDK, którego potrzebujesz (twój kod lub wersję SDK używaną do kompilacji zewnętrznej biblioteki). Jeśli masz ten sam problem, sprawdź linię Android SDK i kliknij „Edytuj”. Zostaniesz przeniesiony do innego panelu, w którym masz Java SDK, wybierz 1.7 (lub wersję, którą musisz skompilować)
Marco Acierno
2
Naprawiono tę samą sytuację, przechodząc do ustawień modułu i edytując lokalizację JDK do katalogu domowego, w którym zainstalowano Java 7 jre
zztonedefzz
27

Jeśli ludzie uznają odpowiedź @Marco Acierno za nieco niejasną, rozwiązaniem jest upewnienie się, że tworzysz w Javie 7, a nie w wyższej wersji.

W przypadku Android Studio zmień File -> Project Structure -> SDK Location -> JDK Locationna jdk1.7.x. W przypadku wiersza poleceń upewnij się, że dane java -versionwyjściowe java version "1.7.x".

Chris Lacy
źródło
Używałem IntelliJ IDEA, więc w moim przypadku musiałem umieścić właściwy Java SDK, kiedy dodałem Android SDK ... (nie możesz po prostu wybrać Java 1.x w module Android, inaczej nie zobaczysz klas Androida)
Marco Acierno
15
Dlaczego nie możemy używać Java 8?
Sujay
5

Ustawienie JAVA_HOME z powrotem na 1.7 działało dla mnie.

Vishal Singh
źródło
3

zmień wszystkie wersje swojego modułu java na java 1.7 w każdym pliku build.grade.

we wtyczce będącej biblioteką i aplikacją

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

i java

sourceCompatibility= 1.7
targetCompatibility= 1.7
baiiu
źródło
To była jedyna rzecz, jaką musiałem zrobić. Dzięki
Chisko
2

Ten problem występuje, gdy używany jest .jarplik, który nie korzysta z żadnej funkcji języka Java 6 lub nowszej, ale został utworzony przy użyciu języka Java 6 lub nowszego.

Jeśli utworzyłeś ten .jarplik, nie musisz niczego zmieniać w Gradlelub ProGuardlub Compiler Version. Rozwiązanie jest bardzo proste, po prostu zbuduj ten .jarplik ponownie, ale używając Java 5 lub mniej .

Więcej szczegółów .

Bugs Happen
źródło
w moim przypadku jest to plik .aar. Co powinienem zrobić?
GvSharma
1

Miałem podobny problem, rozwiązałem go poprzez aktualizację mojego proguarda. pobierz swoją wersję proguard za pomocą tego polecenia

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

pobierz najnowszy plik progaurd.jar stąd ( http://proguard.sourceforge.net )

zastąp istniejący android-sdks / tools / proguard / lib / proguard.jar nowym plikiem .jar.

Mam nadzieję, że to powinno ci pomóc. Jeśli używasz java 8, powinieneś zaktualizować do proguard 5.x coz proguard 4.x nie obsługuje java 8.

spaceMonkey
źródło
@RookieGuy, spróbuj ustawić wersję java z powrotem na 1.7, która również zadziałała.
spaceMonkey
Dzięki za wskazówkę, musiałem przekompilować biblioteki, które były zawarte w zależnościach przechodnich, napisałem to tutaj uc-mobileapps.com/index.html%3Fp=509.html w celach informacyjnych, ponieważ wersje zmieniły się trochę
RookieGuy
1

miał podobny problem, gdy próbowałem dodać samodzielnie utworzoną bibliotekę z netbeans do studia Android. Ustawienie kompatybilności źródła i celu w Android Studio oraz formatu źródłowego / binarnego w netbeans (oba!) na java 1.7 rozwiązało problem.

w Android Studio:

Struktura projektu -> Moduły / aplikacja -> Właściwości -> Źródło i cel do wersji 1.7

w netbeans:

Plik -> Właściwości projektu -> Źródła -> Źródło / Format binarny do wersji 1.7

następnie wyczyść i stwórz swój projekt netbeans i skopiuj .jar z „NBProj / dist” do „app / libs”

RickPat
źródło
0

udostępnij rozwiązanie przypadku, jeśli zainstalowana jest tylko Java8, po prostu ustaw poziom kompilatora Java na 1.7, a następnie przebuduj projekt powinien być OK.

suiwenfeng
źródło
0

Wystąpił błąd podczas korzystania z biblioteki innej firmy. Zgodnie z powyższym pytaniem konieczna była wymiana biblioteki zgodnie z powyższym komunikatem śledzenia stosu:

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

z odpowiednią wersją.

Odpowiadając na pytanie, bananaquery.jarma zostać zastąpiona wersją kompatybilną z Javą.

gotwo
źródło