Sihir atau versi file kelas buruk

101

Saya sudah tahu bahwa pertanyaan itu sudah sangat sering ditanyakan dan jawabannya, tetapi tidak ada jawaban yang saya temukan memperbaiki masalah saya.

Ini kesalahannya:

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

Kesalahannya adalah bad class file magic (cafebabe) or version (0034.0000).

Saya membangun dan mengeksekusi aplikasi tanpa masalah berkali-kali di hari yang sama tetapi sekarang ini selalu gagal dengan pesan ini.


SDK proyek adalah Android API 19 Platformdan tingkat proyek 1.7.

CompileSDK adalah 19dan buildToolsVersion adalah '20.0.0'.

Opsi kompilasi:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

dan dependenciessaya punya:

compile files('libs/bananaquery.jar')

Perpustakaan dibangun dengan SDK Android API 19 Platformdengan tingkat proyek 1.7.

.jarFile saya ada di dalam libs/folder.

Saya menggunakan IntelliJ IDEA 14 Preview, mungkinkah itu alasannya? Dengan IntellIJ IDEA 13 ini tetap macet di "Gradle sync"

mengkompilasi file bisa jadi tidak berguna karena saya compile fileTree(dir: 'libs', include: ['*.jar'])juga punya

Marco Acierno
sumber
Hai Saya memiliki masalah yang sama tetapi untuk menempatkan kompiler proyek ke 1,7 tidak membantu, tolong dapatkah Anda melihatnya? stackoverflow.com/questions/29098038/…
Csabi
Masalahnya bisa banyak hal, saya menggunakan 1.7 karena saya menggunakan Java 1.7, coba ubah ke 1.6
Marco Acierno
Hai Saya mencoba seluruh proyek menjadi 1.6 itu tidak membantu, saya menggunakan perpustakaan itu sebelumnya, saya baru saja memperbarui file .jar sedikit pun versi yang lebih baru, Mungkinkah masalah itu dikompilasi dengan java yang lebih tinggi?
Csabi
Saya menempuh jalan panjang untuk memperbaiki masalah ini dan menyadari kesalahan kompilasi terjadi pada perpustakaan yang saya impor. Ini adalah perbedaan penting karena tidak ada perubahan pengaturan compiler IDE lokal yang akan memperbaiki sesuatu yang sedang diimpor.
Shadoninja

Jawaban:

95

JAVA_HOMEvariabel saya berubah menjadi Java 1.8 dan saya mendapat pesan kesalahan ini saat menyusun modul java murni sebagai ketergantungan proyek android saya.

build.gradle dari modul java

apply plugin: 'java'

Solusi # 1: Cepat kotor

Saya memperbaikinya dengan menyetel JAVA_HOMEpunggung saya ke 1,7:

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

Solusi # 2: Ubah versi kompiler:

ubah kembali ke 1.7 untuk modul khusus ini di build.gradle-nya

apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
ketinggalan jaman
sumber
4
Dalam versi percobaan Gradle sintaksnya adalah:compileOptions.with { sourceCompatibility=JavaVersion.VERSION_1_7 targetCompatibility=JavaVersion.VERSION_1_7 }
Stephen Kaiser
Solusi 2 berhasil untuk saya, meskipun Android Studio menggarisbawahi sourceCompatibility dan targetCompatibility yang menyatakan bahwa "Assignment is not used"
CodyF
39

Ok, salahku.

Di bagian SDK Proyek, ketika Anda menambahkan, Android SDKAnda harus menyediakan Java SDKdan semua SDK Android saya menggunakan Java 8 sebagai SDK sehingga membuat file kelas dengan versi yang salah meskipun tingkat Proyek adalah 1.7(saya tidak tahu mengapa, saya kira bahwa semuanya dipilih berdasarkan level Proyek).

Sekarang saya mengubah SDK ( java version "1.x.0"bagian.)

masukkan deskripsi gambar di sini

dan tampaknya dapat dikompilasi dengan baik.

Alasan yang berhasil sebelum hari ini adalah karena SDK saya dulu 1.8dan tidakAndroid API x

Marco Acierno
sumber
saya memiliki masalah yang sama. di mana saya harus mengubah ini. Terima kasih
rupesh
1
Saat Anda menambahkan Android SDK, Anda harus menentukan SDK mana yang Anda rujuk ... (Dalam kasus saya, saya memilih Java 7 karena saya menggunakan versi ini) Tetapi itu juga tergantung pada kasus Anda. Cari online untuk kesalahan lain dengan nama yang sama, Anda akan menemukan banyak informasi
Marco Acierno
apakah Anda berbicara tentang layar preferensi ??
rupesh
3
Buka Jendela struktur proyek> Di mana pilihan dengan pesan "Project SDK" pilih SDK yang Anda perlukan (kode atau versi SDK yang digunakan untuk mengompilasi lib eksternal). Jika Anda memiliki masalah yang sama, periksa baris Android SDK Anda dan klik "Edit". Anda akan dipindahkan ke panel lain, di mana Anda memiliki Java SDK, pilih 1.7 (atau versi yang perlu Anda kompilasi)
Marco Acierno
2
Memperbaiki situasi yang sama dengan membuka Pengaturan Modul dan mengedit lokasi JDK ke direktori home tempat Java 7 jre diinstal
zztonedefzz
27

Jika orang merasa jawaban @Marco Acierno agak tidak jelas, solusinya adalah memastikan Anda membangun dengan Java 7 dan bukan versi yang lebih tinggi.

Untuk Android Studio, ubah File -> Project Structure -> SDK Location -> JDK Locationke jdk1.7.x. Untuk baris perintah, pastikan java -versionkeluaran java version "1.7.x".

Chris Lacy
sumber
Saya menggunakan IntelliJ IDEA jadi dalam kasus saya, saya harus meletakkan Java SDK yang benar ketika saya menambahkan Android SDK ... (Anda tidak bisa hanya memilih Java 1.x di Modul Android jika tidak, ia tidak akan melihat kelas Android)
Marco Acierno
15
Mengapa kita tidak bisa menggunakan java 8?
Sujay
5

Menyetel JAVA_HOME kembali ke 1.7 berhasil untuk saya.

Vishal Singh
sumber
3

ubah semua versi modul java Anda menjadi java 1.7 di setiap file build.grade.

dalam plugin yang merupakan library dan aplikasi

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

dan di java

sourceCompatibility= 1.7
targetCompatibility= 1.7
baiiu
sumber
Ini adalah satu-satunya hal yang perlu saya lakukan. Terima kasih
Chisko
2

Masalah ini terjadi saat Anda menggunakan .jarfile yang tidak menggunakan fitur Java 6 atau lebih tinggi tetapi dibuat menggunakan Java 6 atau lebih tinggi.

Jika Anda membuat .jarfile itu maka Anda tidak perlu mengubah apa pun di Gradleatau ProGuardatau Compiler Version. Solusinya sangat sederhana, cukup buat .jarfile itu lagi tetapi menggunakan Java 5 atau kurang .

Lebih detail .

Bug Terjadi
sumber
dalam kasus saya itu adalah file .aar. Apa yang harus saya lakukan?
GvSharma
1

Saya memiliki masalah serupa, saya mengatasinya dengan meningkatkan proguard saya. dapatkan versi proguard Anda dengan perintah ini

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

dapatkan file progaurd.jar terbaru dari sini ( http://proguard.sourceforge.net )

ganti android-sdks / tools / proguard / lib / proguard.jar yang ada dengan file .jar yang baru.

Semoga ini bisa membantu Anda. Jika Anda menggunakan java 8 maka Anda harus mengupgrade ke proguard 5.x karena proguard 4.x tidak mendukung java 8.

spaceMonkey
sumber
@RookieGuy coba atur versi java kembali ke 1.7, yang juga berhasil untuk saya.
spaceMonkey
Terima kasih atas petunjuknya, saya harus mengkompilasi ulang pustaka yang disertakan dengan dependensi transitif, menulisnya di sini uc-mobileapps.com/index.html%3Fp=509.html untuk referensi, karena versinya telah sedikit berubah
RookieGuy
1

memiliki masalah serupa ketika saya mencoba menambahkan perpustakaan buatan sendiri dari netbeans ke studio android. mengatur kompatibilitas sumber dan target di studio android dan format sumber / biner di netbeans (keduanya!) ke java 1.7 memecahkan masalah.

di studio android:

Struktur Proyek -> Modules / App -> Propreties -> Source- dan Target ke 1.7

di netbeans:

File -> Properti Proyek -> Sumber -> Sumber / Format Biner ke 1.7

kemudian bersihkan dan bangun proyek netbeans Anda dan salin .jar dari "NBProj / dist" ke "app / libs"

RickPat
sumber
0

berbagi solusi dari kasus ini jika hanya Java8 yang diinstal, cukup setel level compiler Java ke 1.7 dan kemudian membangun kembali proyek tersebut harus OK.

suiwenfeng
sumber
0

Saya mendapat kesalahan saat menggunakan perpustakaan pihak ketiga. Sesuai dengan pertanyaan yang disebutkan di atas, perpustakaan harus diganti sesuai dengan pesan pelacakan tumpukan di atas:

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

dengan versi yang sesuai.

Sesuai dengan pertanyaan, bananaquery.jarakan diganti dengan versi yang kompatibel dengan Java.

gotwo
sumber