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ż


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

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


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".


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


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

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 .


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.


@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”


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.


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ą.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.