เวทมนตร์หรือเวอร์ชันของไฟล์คลาสไม่ดี


101

ฉันรู้อยู่แล้วว่าคำถามนั้นถูกถามบ่อยมากและมีคำตอบ แต่ไม่มีคำตอบใดที่ฉันพบว่าแก้ไขปัญหาของฉันได้

มันคือข้อผิดพลาด:

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

bad class file magic (cafebabe) or version (0034.0000)มีข้อผิดพลาด

ฉันสร้างและเรียกใช้แอปพลิเคชันโดยไม่มีปัญหาหลายครั้งในวันเดียวกัน แต่ตอนนี้ล้มเหลวทุกครั้งที่มีข้อความนี้


โครงการ SDK เป็นและระดับโครงการคือAndroid API 19 Platform1.7

CompileSDK เป็น19และ buildToolsVersion '20.0.0'คือ

ตัวเลือกการรวบรวม:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

และในdependenciesฉันมี:

compile files('libs/bananaquery.jar')

ไลบรารีสร้างด้วย SDK Android API 19 Platformพร้อมระดับโปรเจ็ก1.7ต์

.jarไฟล์ของฉันอยู่ในlibs/โฟลเดอร์

ฉันใช้ IntelliJ IDEA 14 Preview อาจเป็นสาเหตุ? ด้วย IntellIJ IDEA 13 จะยังคงติดอยู่ที่ "Gradle sync"

ไฟล์คอมไพล์อาจไร้ประโยชน์เพราะฉันมีcompile fileTree(dir: 'libs', include: ['*.jar'])เช่นกัน


สวัสดีฉันมีปัญหาที่คล้ายกัน แต่การใส่โปรเจ็กต์คอมไพเลอร์เป็น 1.7 ไม่ได้ช่วยโปรดลองดูได้ไหม stackoverflow.com/questions/29098038/…
Csabi

ปัญหาอาจมีหลายอย่างฉันใช้ 1.7 เพราะฉันใช้ Java 1.7 ลองเปลี่ยนเป็น 1.6
Marco Acierno

สวัสดีฉันลองโปรเจ็กต์ทั้งหมดที่ใส่เป็น 1.6 แต่ไม่ได้ผลฉันใช้ไลบรารีนั้นมาก่อนฉันเพิ่งอัปเดตไฟล์. jar เป็นเวอร์ชันที่ใหม่กว่าอาจเป็นปัญหาที่คอมไพล์ด้วย java ที่สูงขึ้น?
Csabi

ฉันเดินตามเส้นทางอันยาวไกลในการแก้ไขปัญหานี้และตระหนักว่าเกิดข้อผิดพลาดในการคอมไพล์ในไลบรารีที่ฉันกำลังนำเข้า นี่เป็นความแตกต่างที่สำคัญเนื่องจากไม่มีการเปลี่ยนแปลงการตั้งค่าคอมไพลเลอร์ IDE ในเครื่องจะแก้ไขบางสิ่งที่กำลังนำเข้า
Shadoninja

คำตอบ:


95

JAVA_HOMEตัวแปรของฉันเปลี่ยนเป็น Java 1.8 และฉันได้รับข้อความแสดงข้อผิดพลาดนี้เมื่อรวบรวมโมดูล java บริสุทธิ์เป็นการพึ่งพาโครงการ Android ของฉัน

build.gradle ของโมดูล java

apply plugin: 'java'

โซลูชัน # 1: เร่งสิ่งสกปรก

ฉันแก้ไขโดยตั้งค่าJAVA_HOMEด้านหลังเป็น 1.7:

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

โซลูชัน # 2: เปลี่ยนเวอร์ชันคอมไพเลอร์:

เปลี่ยนกลับเป็น 1.7 สำหรับโมดูลเฉพาะนี้ใน build.gradle

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

4
ใน Gradle เวอร์ชันทดลองไวยากรณ์คือ:compileOptions.with { sourceCompatibility=JavaVersion.VERSION_1_7 targetCompatibility=JavaVersion.VERSION_1_7 }
Stephen Kaiser

โซลูชันที่ 2 ใช้ได้ผลสำหรับฉันแม้ว่า Android Studio จะขีดเส้นใต้ sourceCompatibility และ targetCompatibility เป็นสีเทาโดยระบุว่า "ไม่ได้ใช้ Assignment"
CodyF

39

ตกลงฉันไม่ดี

ในส่วน Project SDK เมื่อคุณเพิ่มAndroid SDKคุณควรระบุJava SDKและ Android SDK ทั้งหมดของฉันใช้Java 8เป็น SDK ดังนั้นจึงสร้างไฟล์คลาสด้วยเวอร์ชันที่ไม่ถูกต้องแม้ว่าระดับโครงการจะเป็น1.7(ฉันไม่รู้ว่าทำไมฉันควร ทุกอย่างถูกเลือกโดยระดับโครงการ)

ตอนนี้ฉันเปลี่ยน SDK แล้ว ( java version "1.x.0"ส่วน)

ใส่คำอธิบายภาพที่นี่

และดูเหมือนว่าจะรวบรวมได้ดี

เหตุผลที่ทำงานก่อนวันนี้เป็นเพราะ SDK ของฉัน1.8ไม่ใช่Android API x


ฉันมีปัญหาเดียวกัน ควรเปลี่ยนตรงไหนดี ขอบคุณ
rupesh

1
เมื่อคุณเพิ่ม Android SDK คุณควรระบุ SDK ที่คุณอ้างถึง ... (ในกรณีของฉันฉันเลือก Java 7 เพราะฉันใช้เวอร์ชันนี้) แต่ก็ขึ้นอยู่กับกรณีของคุณด้วย ค้นหาข้อผิดพลาดอื่น ๆ ทางออนไลน์ที่มีชื่อเดียวกันคุณจะพบข้อมูลมากมาย
Marco Acierno

คุณกำลังพูดถึงหน้าจอการตั้งค่า ??
Rupesh

3
เปิดหน้าต่างโครงสร้างโครงการ> ตัวเลือกที่มีข้อความ "Project SDK" อยู่ที่ไหนให้เลือก SDK ที่คุณต้องการ (รหัสของคุณหรือเวอร์ชันของ SDK ที่ใช้ในการคอมไพล์ lib ภายนอก) หากคุณมีปัญหาเดียวกันให้ตรวจสอบบรรทัด Android SDK ของคุณแล้วคลิก "แก้ไข" คุณจะถูกย้ายไปที่แผงควบคุมอื่นซึ่งคุณมี Java SDK ให้เลือก 1.7 (หรือเวอร์ชันที่คุณต้องคอมไพล์)
Marco Acierno

2
แก้ไขสถานการณ์เดียวกันโดยไปที่การตั้งค่าโมดูลและแก้ไขตำแหน่ง JDK ไปยังโฮมไดเร็กทอรีที่ติดตั้ง Java 7
jre

27

ในกรณีที่ผู้คนพบว่าคำตอบของ @Marco Acierno ไม่ชัดเจนวิธีแก้ปัญหาคือเพื่อให้แน่ใจว่าคุณกำลังสร้างด้วย Java 7 ไม่ใช่เวอร์ชันที่สูงกว่า

สำหรับ Android สตูดิโอ, เปลี่ยนไปFile -> Project Structure -> SDK Location -> JDK Location jdk1.7.xสำหรับบรรทัดคำสั่งให้ตรวจสอบผลjava -versionjava version "1.7.x"


ฉันใช้ IntelliJ IDEA ดังนั้นในกรณีของฉันฉันต้องใส่ Java SDK ที่ถูกต้องเมื่อฉันเพิ่ม Android SDK ... (คุณไม่สามารถเลือก Java 1.x ในโมดูล Android ได้ไม่เช่นนั้นจะไม่เห็นคลาส Android)
Marco Acierno

15
ทำไมเราถึงใช้ java 8 ไม่ได้?
Sujay


3

เปลี่ยนเวอร์ชัน java โมดูลทั้งหมดของคุณเป็น java 1.7 ในทุกไฟล์ build.grade

ในปลั๊กอินซึ่งเป็นไลบรารีและแอปพลิเคชัน

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

และใน java

sourceCompatibility= 1.7
targetCompatibility= 1.7

นี่เป็นสิ่งเดียวที่ฉันต้องทำ ขอบคุณ
Chisko

2

ปัญหานี้เกิดขึ้นเมื่อคุณใช้.jarไฟล์ที่ไม่ได้ใช้คุณลักษณะใด ๆ ของ Java 6 หรือสูงกว่า แต่สร้างขึ้นโดยใช้ Java 6 หรือสูงกว่า

ถ้าคุณสร้างที่.jarไฟล์แล้วคุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรในGradleหรือหรือProGuard Compiler Versionการแก้ปัญหาคือง่ายมากเพียงแค่สร้างที่.jarไฟล์อีกครั้ง แต่ใช้ Java 5 หรือน้อยกว่า

รายละเอียดเพิ่มเติม .


ในกรณีของฉันมันคือไฟล์. aar ฉันควรทำอย่างไรดี?
GvSharma

1

ฉันมีปัญหาที่คล้ายกันฉันแก้ไขได้โดยการอัปเกรดโปรการ์ด รับรุ่น proguard ของคุณด้วยคำสั่งนี้

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

รับไฟล์ progaurd.jar ล่าสุดจากที่นี่ ( http://proguard.sourceforge.net )

แทนที่ android-sdks / tools / proguard / lib / proguard.jar ที่มีอยู่ด้วยไฟล์. jar ใหม่

หวังว่าสิ่งนี้จะช่วยคุณได้ หากคุณใช้ java 8 คุณควรอัปเกรดเป็น proguard 5.x coz proguard 4.x ไม่รองรับ java 8


@RookieGuy ลองตั้งค่าเวอร์ชัน java กลับไปที่ 1.7 ซึ่งใช้ได้กับฉันด้วย
spaceMonkey

ขอบคุณสำหรับคำใบ้ฉันต้องคอมไพล์ไลบรารีที่มาพร้อมกับการอ้างอิงสกรรมกริยาใหม่เขียนไว้ที่นี่uc-mobileapps.com/index.html%3Fp=509.htmlสำหรับการอ้างอิงเนื่องจากเวอร์ชันมีการเปลี่ยนแปลงเล็กน้อย
RookieGuy

1

มีปัญหาคล้ายกันเมื่อฉันพยายามเพิ่มไลบรารีที่สร้างขึ้นเองจาก netbeans ไปยัง android studio การตั้งค่าความเข้ากันได้ของซอร์สและเป้าหมายใน android studio และซอร์ส / รูปแบบไบนารีใน netbeans (ทั้งคู่!) เป็น java 1.7 ช่วยแก้ปัญหาได้

ในสตูดิโอ Android:

โครงสร้างโครงการ -> โมดูล / แอป -> Propreties -> Source- และกำหนดเป้าหมายเป็น 1.7

ใน netbeans:

File -> Project Properties -> Sources -> Source / Binary Format เป็น 1.7

จากนั้นทำความสะอาดและสร้าง netbeans projekt ของคุณและคัดลอก. jar จาก "NBProj / dist" เป็น "app / libs"


0

แชร์วิธีแก้ปัญหาของกรณีนี้หากติดตั้งเฉพาะ Java8 เพียงตั้งค่าระดับคอมไพเลอร์ Java เป็น 1.7 จากนั้นสร้างโครงการใหม่ก็น่าจะใช้ได้


0

ฉันได้รับข้อผิดพลาดเมื่อใช้ไลบรารีของบุคคลที่สาม ตามคำถามที่กล่าวมาข้างต้นจำเป็นต้องเปลี่ยนไลบรารีตามข้อความการติดตามสแต็กข้างต้น:

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

ด้วยเวอร์ชันที่เหมาะสม

ตามคำถามbananaquery.jarจะถูกแทนที่ด้วยเวอร์ชันที่เข้ากันได้กับ Java

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.