NoClassDefFoundError - Eclipse และ Android


193

ฉันมีปัญหาในการพยายามเรียกใช้แอพ Android ซึ่งขึ้นไปจนถึงการเพิ่มไลบรารี่ภายนอกตัวที่สองลงในพา ธ บิลด์ของมันก็ทำงานได้ดี ตั้งแต่เพิ่ม jar scoreninja ตอนนี้ฉันได้รับNoClassDefFoundErrorเมื่อฉันพยายามเรียกใช้แอป

นี่คือข้อความ:

02-11 21:45:26.154: ERROR/AndroidRuntime(3654): java.lang.NoClassDefFoundError: com.scoreninja.adapter.ScoreNinjaAdapter

เนื่องจากสคริปต์ build ทั้งหมดสร้างขึ้นโดยเครื่องมือ Android (?) ฉันไม่แน่ใจว่าจะทำอะไรได้นอกจากล้างและสร้างใหม่หรือรีสตาร์ท eclipse (ฉันลองทั้งสามอย่างแล้ว) ไม่มีใครรู้ว่าฉันสามารถแก้ไขได้อย่างไร


1
คุณเพิ่มไฟล์ jar อย่างไร คุณได้เพิ่มโดยใช้เส้นทางการสร้าง -> ไลบรารี -> ไหภายนอกหรือไม่?
Teja Kantamneni

1
คลิกขวาที่โครงการ> สร้างเส้นทาง> เพิ่มคลังเก็บภายนอก ... ตามคำแนะนำที่นี่: scoreninja.appspot.com
Tom R

4
หากคุณอัปเดต ADT เมื่อเร็ว ๆ นี้ให้ดูคำตอบของ John ด้านล่าง (และโหวตขึ้น!) stackoverflow.com/a/9916751/489852
Atul Goyal

1
หากคุณมีปัญหานี้ก่อนที่คุณจะกระโดดลงไปในคำตอบของ John คำตอบของ @Till ด้านล่างคือการแก้ปัญหาให้กับคนจำนวนมากด้วยตัวเองรวมอยู่ด้วย
Carlos P

คุณลอง multidex หรือไม่
Ashish Rawat

คำตอบ:


234

ฉันมีปัญหานี้หลังจากอัปเดต ADT

ฉันกำลังเก็บไฟล์ JAR ทั้งหมดของฉันไว้ในโฟลเดอร์ชื่อ "lib" และเพิ่ม jars ในเส้นทางการสร้างด้วยวิธี Eclipse ปกติ สิ่งนี้ใช้ได้ดีจนกระทั่งการอัปเดตของฉัน

หลังจากอัปเดตของฉันฉันได้รับ NoClassDefFoundError สำหรับชั้นเรียนที่ฉันเห็นได้อย่างชัดเจนว่าถูกรวมอยู่ในขวด

ทางออกคือการลบไหของฉันออกจากเส้นทางการสร้างและเปลี่ยนชื่อโฟลเดอร์ "lib" ของฉันเป็น "libs" นี่คือการประชุม ant และน่าจะเป็นวิธีที่ ADT ใหม่ค้นหาและรวมไลบรารีในไฟล์. apk เมื่อฉันทำสิ่งนี้ทุกอย่างทำงานได้ดี


1
ขอบคุณมาก! ฉันไม่มีโฟลเดอร์ lib หรือโฟลเดอร์ libs ก่อนอัปเดต ADT ของเมื่อวานและทุกอย่างทำงานได้ดี หลังจากอัปเดตไหภายนอกทั้งหมดมีปัญหานี้ พวกเขาได้รับการแก้ไขแล้วขอบคุณคำตอบของคุณ ฉันต้องรวมคุณกับไบรอันเพื่อให้มันใช้งานได้
ฮ่องกง

ขอบคุณจอห์น! ฉันจะเพิ่มที่หลังจากเปลี่ยนโฟลเดอร์เป็น libs ฉันต้องรีสตาร์ทคราสเพื่อให้ทำงาน
Michaeldcooney

5
ฉันพบปัญหาเดียวกันหลังจากอัปเดต ADT แต่ฉันเก็บไหไว้ในไดเรกทอรีนอกโครงการของฉันและรวมไว้เป็นคลังผู้ใช้ในเส้นทางการสร้างของฉัน วิธีแก้ไขคือลบไลบรารีผู้ใช้ออกจากเส้นทางการสร้างของฉันและรวมไหด้วยการใช้ "Add Jars ภายนอก" จากนั้นให้ทำการส่งออกโดยทำเครื่องหมายที่ช่องในแท็บ "สั่งซื้อและส่งออก"
เทรวิส

1
ฉันอ้างอิง android-support-v13.jar เป็นไลบรารีภายนอกที่ C: \ android-sdk-windows \ extras \ android \ Compatible \ v13 ฉันย้าย JAR นั้นไปที่โฟลเดอร์ libs โครงการและลบการอ้างอิงจาก Java Build Path -> Libraries งานสร้างที่สะอาดและฉันกำลังจะไปอีกครั้ง
Snowwire

สวัสดี ฉันลองวิธีของเราโดยการเพิ่ม libs jar ภายนอกภายใน / libs และตอนนี้ฉันได้รับข้อผิดพลาดนี้: การแปลงเป็นรูปแบบ Dalvik ล้มเหลวด้วยข้อผิดพลาด 1
Jonathan

100

ฉันไม่ต้องใส่ jar-library ในทรัพย์สินหรือ lib แต่เพียงทำเครื่องหมายที่ช่องสำหรับ jar นี้ใน Properties -> Java Build Path -> "Order and Export" (มันถูกระบุไว้ก่อนหน้านี้ แต่ไม่ได้เลือก )


ขอบคุณมาก! ฉันดิ้นรนกับข้อผิดพลาดนี้มานานแล้วและสิ่งที่ฉันต้องทำก็แค่ทำเครื่องหมายที่กล่องยวนสำหรับโถในหน้าจอ "สั่งซื้อและส่งออก" สิ่งที่ตลกคือฉันต้องทำเช่นนี้เพื่อที่จะทำงานกับเครื่องจำลองแท็บเล็ตของนุ๊ก ไม่มีปัญหากับอุปกรณ์หรือตัวเลียนแบบอื่น ๆ
Luis

5
ไม่มีใครรู้ว่าทำไมคุณต้องทำทั้งสองอย่างเพิ่มห้องสมุดและเลือกช่องทำเครื่องหมายในการสั่งซื้อและส่งออก? มีเหตุผลที่ฉันต้องการเพิ่ม JAR ภายนอก แต่ไม่รวมในการสั่งซื้อและส่งออกหรือไม่
Lou Morda

ฉันมีปัญหานี้หลังจากอัปเดต ADT และสิ่งนี้แก้ไขได้สำหรับฉัน
cdavidyoung

5
มันช่วยฉันได้ แต่หลังจากที่ฉันทำโครงการ -> สะอาด
altumano

ขอบคุณ !! ช่วยฉัน ต้องทำความสะอาดและรีสตาร์ทหลังจากติดตั้ง Eclipse Juno
Rynardt

68

ด้วยการเพิ่ม jar ภายนอกลงในเส้นทางการสร้างของคุณเพียงแค่เพิ่ม jar เข้ากับแพ็คเกจของคุณ แต่จะไม่สามารถใช้ได้ในระหว่างรันไทม์

เพื่อให้ jar สามารถใช้งานได้ในขณะทำงานคุณต้อง:

  • วางขวดไว้ใต้ของคุณ assetsโฟลเดอร์
  • รวมสำเนาโถนี้ไว้ในเส้นทางการสร้างของคุณ
  • ไปที่แท็บส่งออกในหน้าต่างป๊อปอัปเดียวกัน
  • ทำเครื่องหมายที่กล่องกับเหยือกที่เพิ่งเพิ่มเข้าไป

ScoreNinjaAdapter เป็นรหัสของคนอื่น แต่ฉันจะแปลกใจมากถ้ามันมีข้อผิดพลาดดังกล่าวเป็นเพราะการใช้งานทั่วไป ข้อผิดพลาดเกิดขึ้น ณ จุดหนึ่งในรหัสของฉันเอง
Tom R

ข้อผิดพลาดเกิดขึ้นที่นี่อย่างแท้จริง: sna = new ScoreNinjaAdapter (สิ่งนี้ SN_APP_ID, SN_APP_KEY);
Tom R

คุณต้องการimportคำสั่งสำหรับไฟล์ jar ภายนอกหรือไม่? ฉันไม่เคยใช้มัน
Anthony Forloney

คุณลองลบไฟล์. jar ออกจากassestsโฟลเดอร์แล้วหรือยัง?
Anthony Forloney

ใช่. ในที่สุดฉันก็เบื่อหน่ายทั้งหมดนี้และเพิ่งดาวน์โหลดซอร์สและคัดลอกไฟล์ต้นฉบับไปยังโครงการของฉัน ไม่ใช่ทางออกที่ดีที่สุด แต่ใช้ได้ในขณะนี้ ขอบคุณสำหรับความช่วยเหลือของคุณ
Tom R

48

ฉันมีสิ่งนี้สำหรับ MapActivity บิลด์ใน Eclipse รับ NoClassDefFound ในดีบักเกอร์

ลืมที่จะเพิ่มไลบรารีไปยังรายการภายใน<Application>...</Application>องค์ประกอบ

<uses-library android:name="com.google.android.maps" />

27

ฉันเปลี่ยนลำดับของโปรเจ็กต์ที่รวมไว้ (Eclipse / Configure Build Path / Order และ Export) ฉันย้ายโครงการที่ต้องพึ่งพาสองโครงการไปที่ด้านบนสุดของรายการ "สั่งซื้อและส่งออก" จะแก้ไขปัญหา "NoClassDefFoundError"

มันแปลกสำหรับฉัน ฉันไม่เคยได้ยินเกี่ยวกับความสำคัญของลำดับของห้องสมุดและโครงการที่รวมอยู่ Android + Eclipse สนุกมาก :)


นี่เป็นโซลูชันที่กล่าวถึงโดย usercomment ที่สองที่นี่ใน bugruport: code.google.com/p/android/issues/detail?id=55304
arberg

15

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

ฉันไม่สามารถหาวิธีแก้ปัญหาออนไลน์ได้ แต่คำตอบในหัวข้อที่คล้ายกันทำให้ฉันคิดและตระหนักว่าฉันอาจต้องสร้างใหม่ (หรือล้าง) โครงการ

ใน Eclipse ไปที่ Project => Clean เลือกโครงการของคุณและ Eclipse ดูเหมือนจะแก้ไขเอง สำหรับฉันแล้วการแก้ไขปัญหา

หวังว่านี่จะช่วยได้


ใช่ดูเหมือนว่าจะมีข้อผิดพลาดใน Eclipse / ADT / dex / สิ่งที่โดยทั่วไปขาดเรียนในการสร้าง นอกจากนี้ยังสามารถพลาดApplicationคลาสที่นำไปสู่ข้อผิดพลาดที่แตกต่างกัน
Timmmm

13

ฉันพบปัญหาเดียวกัน เหตุผลก็คือห้องสมุดที่ฉันพยายามใช้นั้นได้รับการรวบรวมด้วยมาตรฐาน JDK 7

ฉันคอมไพล์ใหม่ด้วย-source 1.6 -target 1.6ตัวเลือกและใช้งานได้ดี


ขอบคุณ YOUUUUUUUUUUUUUUUUU !!!!!!!!!!!!!!!!!!!!! ฉันผิดหวังกับปัญหานี้และคุณแก้ไขมันได้! เป็นเรื่องน่าขันที่แม้กระทั่ง Jelly Bean 4.3 SDK (API 18) ล่าสุดก็ยังไม่สามารถอ่าน 1.7 JAR / คลาสได้ และที่แย่ที่สุดก็ไม่ได้บ่นเลย :(
Hendy Irawan

ฉันมีปัญหาเดียวกัน สิ่งที่แย่ที่สุดคือฉันคิดในตัวเลือกนี้จากนั้นฉันเปลี่ยน -source 1.7 ด้วย -source 1.5 (เพื่อให้แน่ใจ) และปัญหาไม่ได้รับการแก้ไข แต่หลังจากอ่านความคิดเห็นของคุณฉันลองอีกครั้งกับ 1.6 แล้วมันทำงานเหมือนมีเสน่ห์
Pedro Náñez

7

สิ่งเดียวกันทำงานสำหรับฉัน: Properties -> Java Build Path -> "การสั่งซื้อและส่งออก" น่าสนใจ - เหตุใดจึงไม่ทำสิ่งนี้โดยอัตโนมัติ ฉันเดาว่าการตั้งค่าบางอย่างขาดหายไป สิ่งนี้เกิดขึ้นกับฉันหลังจากอัปเกรด SDK


3

คลิกขวาที่โฟลเดอร์โครงการของคุณมองหา Properties ใน Java build path และเลือกไฟล์ jar ที่คุณเห็น มันได้ผลสำหรับฉัน



2

ฉันลองทุกอย่างจากโพสต์นี้ (และโพสต์อื่น ๆ ) และมันไม่ได้ผลสำหรับฉันนี่คือการอัปเกรด ADT ที่แย่ที่สุดที่ฉันเคยพบมาและฉันจะไม่อัปเกรดหากไม่มีการสำรองข้อมูล ADT ที่ใช้งานได้

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


2

ฉันมีข้อผิดพลาดเดียวกันกับ ADT22 แก้ไขได้โดยตรวจสอบ "Android Private Libraries" ในคุณสมบัติ -> Java build path -> สั่งซื้อและส่งออก หากคุณกำลังใช้โครงการห้องสมุดใด ๆ โครงการเดียวกันก็ควรทำเช่นเดียวกัน


มันทำงานได้ดีสำหรับฉัน ฉันรวมห้องสมุดแล้ว แต่ลืมตรวจสอบใน "สั่งซื้อและส่งออก" ขอบคุณ!
jmrodrigg

2

คำตอบที่มีอยู่ทั้งหมดไม่ได้ผลสำหรับฉันเพราะกรณีของฉันแตกต่างกันเล็กน้อย ฉันใช้เวลาสองสามชั่วโมงเพื่อให้มันทำงาน ฉันกำลังใช้ Eclipse

โครงการ Android ของฉันมีอีกหนึ่งโครงการ Java 1.6 ปกติซึ่งต้องการไฟล์ jar ของบุคคลที่สาม เคล็ดลับคือ:

  • รวม jar ในโครงการ java ปกติเพื่อให้คอมไพล์ (เท่านั้น) อย่าตรวจสอบในแท็บ "สั่งซื้อและส่งออก"
  • คัดลอกไฟล์ jar นี้ไปยังโฟลเดอร์ "libs" ของโปรเจค android เพื่อให้สามารถใช้งานได้ในรันไทม์

หวังว่าสิ่งนี้จะช่วยผู้ที่มีสถานการณ์คล้ายกันเช่นของฉัน


1

บางครั้งคุณต้องใช้โครงการภายนอกทั้งหมดเป็นห้องสมุดและไม่เพียง แต่ขวด:

ปัญหาของฉันแก้ไขได้โดยการเพิ่มโครงการทั้งหมด (ในกรณีของฉัน google-play-services_lib) เป็นห้องสมุดและไม่เพียง แต่ขวด ขั้นตอนในการดำเนินการ (จากคำตอบ @style ):

  1. File-> New-> อื่น ๆ
  2. เลือกโครงการ Android
  3. เลือก "สร้างโครงการจากแหล่งที่มีอยู่"
  4. คลิกปุ่ม "เรียกดู ... " และไปที่โครงการที่ต้องการ
  5. เสร็จสิ้น (โครงการแถบการกระทำในพื้นที่ทำงานของคุณ)
  6. คลิกขวาที่โครงการของคุณ -> คุณสมบัติ
  7. ใน Android-> ส่วน Library คลิก Add
  8. เลือกโครงการที่เพิ่งเพิ่ม -> ตกลง

1

บางครั้งมันจะเกิดขึ้นเนื่องจากไม่รวม jar ซึ่งคุณมีการพึ่งพาพร้อมกับแท็ก "uses-libary" ใน AndroidManifest.xml ของคุณ

นอกจากนี้ตรวจสอบให้แน่ใจว่าควรอยู่ในแท็ก "แอปพลิเคชัน"

ความนับถือ,

ราวี


1

ฉันมีปัญหานี้และมันเกิดจากการไม่ "ส่งออก" ไลบรารีปัญหาเนื่องจากไฟล์. class สำหรับบางคลาสไม่สามารถใช้งานได้ในขณะที่บรรจุ APK.Compile time มันจะทำงานได้ดีโดยไม่ต้อง exporiting

ในกรณีของฉันฉันใช้คลาส "CusrsorAdapter" และภายใต้ "JavaBuildPath-> การสั่งซื้อและส่งออก" ฉันไม่ได้ตรวจสอบการสนับสนุน V4 jar เมื่อปัญหาถูกเลือกหายไป

เพื่อให้แน่ใจว่าคุณได้รับข้อผิดพลาด noClassDefFound เนื่องจากเหตุผลข้างต้นโปรดตรวจสอบ logacat ของคุณคุณจะเห็นข้อผิดพลาด super class ที่ไม่รู้จักในขณะใช้งาน



0

ฉันลองสิ่งต่าง ๆ และเหตุผลข้อผิดพลาดในกรณีของฉันคือข้อขัดแย้งระหว่าง maps.jar และ Google Api ใน Java Build Path-> ไลบรารี ดังนั้นเมื่อฉันลบ maps.jar มันทำงานได้ดี

ความนับถือ,

wahib


0

โปรดตรวจสอบให้แน่ใจว่าไฟล์ jar ของคุณอยู่ในไดเรกทอรี libs ของโปรเจคในขณะที่คุณใช้ ADT เวอร์ชันใหม่กับ eclipse ของคุณ


0

ฉันได้รับปัญหาเดียวกันที่แน่นอน ... เพื่อแก้ไขฉันเพิ่งลบ Android Private Libs ของฉันใน "build path" และคลิกตกลง ... และเมื่อฉันเปิด op "build path" อีกครั้ง eclipse ได้เพิ่มพวกมันอีกครั้ง แล้วมันก็ได้ผลสำหรับฉัน;) ...


0

ฉันใช้เวลาสองวันพยายามแก้ไขปัญหานี้หลังจากอัปเดต ADT ในที่สุดฉันก็โชคดีที่ได้โพสต์ที่นี่:

https://code.google.com/p/android/issues/detail?id=55304

ซึ่งทำให้ฉันไปในทิศทางที่ถูกต้อง เมื่อคุณทำตามวิธีการแก้ปัญหา - อย่าลืมแทนที่ห้องสมุดสนับสนุน android ของโครงการทั้งหมดของคุณเป็นเวอร์ชันเดียวกัน (ลบออกและติดตั้งใหม่ไปยังโครงการ) ฉันหวังว่านี่จะช่วยได้ - ขอให้โชคดี


0

หากคุณต้องการทราบว่าไฟล์ใดที่การแก้ปัญหาเกี่ยวข้องกับสิ่งที่ฉันพบ เปลี่ยนไฟล์. classpath เป็น

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" path="gen"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
    <classpathentry kind="output" path="bin/classes"/>
</classpath>

แทนที่ไฟล์. classpath ในโครงการไลบรารีทั้งหมดและในโครงการ android หลัก ไฟล์. classpath อยู่ในโฟลเดอร์รูทของโครงการ eclipse สาเหตุอย่าลืมเพิ่มรายการ classpath ของคุณเองหากคุณมีรายการใด ๆ (ดังนั้นให้เปรียบเทียบกับ. classpath เวอร์ชันปัจจุบันของคุณ)

ฉันเชื่อว่านี่เป็นผลลัพธ์เดียวกับที่ดำเนินการผ่านเมนู eclipse ตามที่ผู้ใช้อธิบายไว้ข้างต้น (Eclipse / Configure Build Path / Order และ Export)


0

ทางออกที่นี่ทำงานให้ฉัน เป็นเรื่องของการนำเข้าไลบรารีไปยังโฟลเดอร์ libs จากนั้นแก้ไขไฟล์ build.gradle แล้วล้างด้วย gradlew


0

หากคุณเปลี่ยนคำสั่งซื้อและส่งออกในเส้นทางการสร้างโครงการข้อผิดพลาดนี้จะไม่เกิดขึ้น อีกวิธีหนึ่งในการบรรลุเป้าหมายคือ. classpath ในโฟลเดอร์โครงการของคุณ


0

ลองนี้: -

ขั้นตอนที่ 1

เพิ่มไลบรารีทั้งหมดเพื่อสร้าง pat ใน Eclipse (หมายถึงสร้างไลบรารีอ้างอิงทั้งหมดของไลบรารี)

ขั้นตอนที่ 2

ลบไฟล์ R.java และสร้างโครงการอีกครั้ง ไม่ต้องกังวล R.java จะสร้างขึ้นใหม่โดยอัตโนมัติ

ชิลล์ :)


0

อย่างที่ฉันเข้าใจโครงการของคุณไม่แสดงข้อผิดพลาดเพราะคุณรวม Jar แต่จะไม่ใช้ Jar เมื่อโครงการของคุณมี "ส่งออก" ไปยังอุปกรณ์ ลองสิ่งนี้

โครงการ -> คุณสมบัติ

Java Build Path / สั่งซื้อและส่งออก

[✔] Jar ของคุณ


0

สิ่งนี้เกิดขึ้นกับฉันบ่อยมาก

ครั้งที่เกิดขึ้นที่ฉันจำได้มีสาเหตุมาจากการเปลี่ยน Eclipse ADT (Google รุ่นพิเศษ) เป็น Android Studio และเปลี่ยนกลับ โดยทั่วไปฉันลองใช้วิธีการทั้งหมดที่ฉันพบใน stackoverflow ซึ่งไม่ได้ผลสำหรับฉัน

ในที่สุดฉันก็ทำให้แอปทำงานได้อีกครั้ง (ไม่เกิน NoCalssDeffoundError) โดยสลับ IDE ของฉันไปเป็น Eclipse ดั้งเดิม (Kepler) ด้วย ADT

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