จะแก้ปัญหา java.lang.NoClassDefFoundError ได้อย่างไร?


221

ฉันได้ลองทั้งสองตัวอย่างในJava Tutorialsของ Oracle แล้ว พวกเขาทั้งสองรวบรวมปรับ แต่ในเวลาทำงานทั้งสองเกิดขึ้นกับข้อผิดพลาดนี้:

Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
    at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

ฉันคิดว่าฉันอาจมีMain.javaไฟล์ในโฟลเดอร์ที่ไม่ถูกต้อง นี่คือลำดับชั้นไดเรกทอรี:

graphics
 Main.java
 shapes
|    Square.java
|    Triangle.java
 linepoint
|    Line.java
|    Point.java
 spaceobjects
|    Cube.java
|    RectPrism.java

และนี่คือMain.java:

import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;

public class Main {
    public static void main(String args[]) {
        Square s = new Square(2,3,15);
        Line l = new Line(1,5,2,3);
        Cube c = new Cube(13,32,22);
    }
}

ฉันทำอะไรผิดที่นี่

UPDATE

หลังจากที่ฉันใส่Mainชั้นเรียนลงในgraphicsแพ็คเกจ (ฉันเพิ่มpackage graphics;เข้าไป) ตั้ง classpath เป็น "_test" (โฟลเดอร์ที่มีกราฟิก) รวบรวมและเรียกใช้โดยใช้java graphics.Main(จากบรรทัดคำสั่ง) ใช้งานได้

สายเกินไปอัพเดท # 2

ฉันไม่ได้ใช้ Eclipse (แค่ Notepad ++ และ JDK) และการอัปเดตข้างต้นแก้ปัญหาของฉันได้ อย่างไรก็ตามดูเหมือนว่าคำตอบเหล่านี้มีไว้สำหรับ Eclipse และ IntelliJ แต่มีแนวคิดที่คล้ายกัน


1
ดูคลาสหลักของคุณมันไม่ได้อยู่ในแพ็คเกจ (คุณจะpackage graphics;อยู่ด้านบน) เป็นgraphicsหัวหน้าโครงสร้างแพ็คเกจของคุณหรือไม่ Square มีpackage graphics.shapesที่ด้านบนหรือไม่
lreeder

1
คุณกำลังแสดงรายการว่าไฟล์. java อยู่ที่ใด แต่เนื่องจากสิ่งที่คุณได้รับคือปัญหารันไทม์สิ่งที่คุณสนใจจริง ๆ คือไฟล์. class อยู่ที่ใดและอยู่ใน classpath ของคุณหรือไม่ คุณดำเนินการคลาสหลักอย่างไร
Thor84no

เพียงกด Shift + ctrl + o ใน eclipse เพื่อจัดระเบียบการนำเข้าของคุณ
happybuddha

ตรวจสอบให้แน่ใจว่าคุณพิมพ์ชื่อคลาสอย่างถูกต้อง ฉันได้รับข้อผิดพลาดนี้เพราะฉันไม่ได้เริ่มต้นชื่อชั้นเรียนด้วยตัวอักษรตัวใหญ่
Jeremy Borg

บางครั้งสิ่งนี้เกิดขึ้นใน IntelliJ IDEA หลังจากการปรับโครงสร้างครั้งใหญ่ คลิกขวาที่โครงการของคุณและเลือก -> รวบรวมโมดูลจากนั้นเริ่มโครงการอีกครั้งและควรจะทำงานอีกครั้ง
Zar

คำตอบ:


223

หลังจากที่คุณรวบรวมรหัสของคุณคุณจะจบลงด้วย.classไฟล์สำหรับแต่ละชั้นเรียนในโปรแกรมของคุณ ไฟล์ไบนารีเหล่านี้เป็นโค้ดไบต์ที่ Java ตีความเพื่อรันโปรแกรมของคุณ NoClassDefFoundErrorบ่งชี้ว่า ClassLoader (ในกรณีนี้java.net.URLClassLoader) ซึ่งเป็นผู้รับผิดชอบสำหรับการเรียนแบบไดนามิกโหลดไม่สามารถหา.classไฟล์สำหรับการเรียนที่คุณกำลังพยายามที่จะใช้

รหัสของคุณจะไม่รวบรวมถ้าไม่มีคลาสที่ต้องการ (ยกเว้นว่าคลาสนั้นเต็มไปด้วยการสะท้อน) ดังนั้นโดยปกติแล้วข้อยกเว้นนี้หมายความว่า classpath ของคุณไม่มีคลาสที่ต้องการ จำไว้ว่า classloader (โดยเฉพาะjava.net.URLClassLoader) จะค้นหาคลาสใน package abc ในโฟลเดอร์ a / b / c / ในแต่ละรายการใน classpath ของคุณ NoClassDefFoundErrorยังสามารถระบุได้ว่าคุณไม่มีการพึ่งพาสกรรมกริยาของไฟล์. jar ที่คุณได้คอมไพล์และคุณกำลังพยายามใช้

ตัวอย่างเช่นถ้าคุณมีชั้นเรียนหลังจากรวบรวมคุณจะมีไฟล์ชั้นเรียนcom.example.Foo พูดเช่นไดเรกทอรีการทำงานของคุณFoo.class .../project/ไฟล์ชั้นเรียนที่จะต้องอยู่ใน.../project/com/exampleและคุณจะตั้ง classpath .../project/ของคุณเพื่อ

หมายเหตุด้านข้าง: ฉันขอแนะนำให้ใช้ประโยชน์จากเครื่องมือที่น่าทึ่งซึ่งมีอยู่ในภาษา Java และ JVM IDE ที่ทันสมัยเช่น Eclipse และ IDEA และเครื่องมือการจัดการการสร้างเช่น Maven หรือ Gradle จะช่วยให้คุณไม่ต้องกังวลเกี่ยวกับ classpaths (มาก) และมุ่งเน้นไปที่รหัส! ที่กล่าวมาลิงค์นี้จะอธิบายวิธีการตั้งค่า classpath เมื่อคุณดำเนินการในบรรทัดคำสั่ง


ฉันอ่านข้อความนี้เนื่องจากข้อผิดพลาดที่ฉันพบขณะพยายามเรียกใช้การทดสอบหน่วยบน Android ปรากฎว่า NoClassDefFoundError ในกรณีของฉันเกิดขึ้นเป็นผลมาจากการพึ่งพาที่ขาดหายไปในการทดสอบ ฉันต้องคิดถึงการฉีดพึ่งพาเพื่อป้องกันข้อผิดพลาดเช่นนี้ ขอบคุณสำหรับคำตอบที่ซับซ้อน
พี่เลี้ยงทั่วไป

130

ฉันต้องการที่จะแก้ไขมุมมองของคนอื่น ๆ NoClassDefFoundErrorได้ที่

NoClassDefFoundError สามารถเกิดขึ้นได้จากหลายสาเหตุเช่น

  1. ClassNotFoundException - .class ไม่พบสำหรับคลาสที่อ้างถึงโดยไม่คำนึงว่ามีอยู่ในเวลาคอมไพล์หรือไม่ (เช่นคลาสฐาน / ลูก)
  2. ไฟล์คลาสอยู่ แต่มีข้อยกเว้นยกขณะเริ่มต้นตัวแปรสแตติก
  3. ไฟล์คลาสอยู่ยกเว้นยกขณะเริ่มต้นบล็อกคงที่

ในคำถามเดิมเป็นกรณีแรกที่สามารถแก้ไขได้โดยการตั้งค่า CLASSPATH เป็นไฟล์ jar คลาสที่อ้างอิงหรือไปยังโฟลเดอร์แพ็คเกจ

การพูดว่า "มีเวลารวบรวม" หมายความว่าอย่างไร

  • คลาสที่อ้างอิงถูกใช้ในโค้ด
    เช่น: สองคลาส A และ B (ขยาย A) หากมีการอ้างอิง B โดยตรงในรหัสจะสามารถใช้ได้ในเวลารวบรวมเช่น A a = new B ();

การพูดว่า "ไม่มีให้ในเวลารวบรวม" หมายความว่าอย่างไร

  • คลาสเวลาคอมไพล์และคลาสรันไทม์แตกต่างกันเช่นโหลดคลาสพื้นฐานโดยใช้ classname ของคลาสย่อยเช่น Class.forName ("classname")
    ตัวอย่าง: สองคลาส A และ B (ขยาย A) รหัสมี
    A a = Class.forName ("B") newInstance ();

ในกรณีของฉันฉันได้รวบรวมคลาสพวกเขาย้ายไปยังไดเรกทอรีที่เรียกว่าแอพ ฉันต้องเพิ่มบรรทัดpackage app;และคอมไพล์ใหม่ก่อนที่จะย้ายไปไว้ในแอพย่อย
taco

1
นอกเหนือจากรายการ 3 ที่กล่าวข้างต้น ClassLoaders ยังอาจทำให้เกิดข้อผิดพลาดดังกล่าวซึ่งโดยทั่วไปแล้ว ClassNotFoundException ในคลาสสถานการณ์สมมตินี้อาจมีอยู่ใน classpath แต่พยายามโหลดจาก ClassLoader ที่แตกต่างกัน
Fahad

2 และ 3 เป็น classloader เฉพาะ อ้างอิงจาก javadoc ข้อยกเว้นมีไว้สำหรับเหตุผลที่ 1
ซามูเอล

1
ฉันได้ทดสอบเคส 2 และเคส 3 มันไม่ใช่ NoClassDefFoundError มันคือ ExceptionInInitializerError Case 2.Class ตั้งอยู่ไฟล์ แต่ยกเว้นยกขึ้นขณะที่เริ่มต้นตัวแปรแบบคงที่กรณีไฟล์ 3.Class ตั้งข้อยกเว้นในขณะที่เริ่มต้นบล็อกแบบคงที่
Michael

1
@Michael ลิงก์นี้บอกว่าสแต็คสแต็คของคุณจะแสดงNoClassDefFoundErrorในกรณีนี้เช่น: archive.is/YPbYI#selection-2107.0-2115.13
Pacerier

15

NoClassDefFoundErrorหมายถึงว่าชั้นอยู่ใน classpath ที่Compile timeแต่มันไม่ได้อยู่ใน classpath Runtimeที่

หากคุณกำลังใช้ Eclipse ให้แน่ใจว่าคุณมีshapes, linepointsและspaceobjectsเป็นรายการใน.classpathแฟ้ม


1
วิธีการจัดการในการรันไทม์ที่ผ่านลอง / จับ ?
Maveňツ

5
คำตอบนี้ไม่ถูกต้องในแบบที่คุณเขียน ความถูกต้องจะเป็น: "สาเหตุที่เป็นไปได้หนึ่งข้อผิดพลาดนี้คือ .... " แต่อาจมีสาเหตุอื่นที่ทำให้คุณได้รับข้อผิดพลาดนี้ตัวอย่างเช่นเมื่อโหลดไฟล์ JAR ที่รันไทม์พร้อมกับ classloader
Elmue

13

หากคุณมีข้อผิดพลาดอย่างใดอย่างหนึ่งเหล่านี้ขณะรวบรวมและทำงาน

* NoClassDefFoundError

* Error: Could not find or load main class hello

* Exception in thread "main" java.lang.NoClassDefFoundError:javaTest/test/hello 
(wrong name: test/hello)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

-------------------------- SOLUTIION -----------------------

ปัญหาส่วนใหญ่ในองค์กรแพ็คเกจ คุณควรจัดเรียงคลาสของคุณในโฟลเดอร์อย่างเหมาะสมเกี่ยวกับการจัดประเภทแพ็คเกจในซอร์สโค้ดของคุณ

On Compiling process use this command:

javac -d . [FileName.java]

To Run the class please use this command:

java [Package].[ClassName]

"-d." ในคำสั่ง javac ทำการหลอกลวงสร้างโครงสร้างโฟลเดอร์ของแพ็คเกจแทนการใส่ไฟล์. class ทั้งหมดลงในไดเรกทอรีรากขอบคุณ!
Jorge Sampayo

9
java.lang.NoClassDefFoundError

แสดงอะไรบางอย่างที่ถูกพบในcompiletimeแต่ไม่ได้รันไทม์ บางทีคุณแค่ต้องเพิ่มมันเข้าไปใน classpath


15
ทำอย่างไร
Narendra Singh

ขึ้นอยู่กับบริบทที่คุณขอ
sschrass

6

ไม่มีข้อยกเว้นคลาสนิยามเกิดขึ้นเมื่อไม่พบคลาสที่ต้องการในเส้นทางคลาส At Compile Time Class: Class ถูกสร้างขึ้นจาก Java Compiler แต่อย่างใด ณ เวลารันไทม์ไม่พบ Dependent Class

ให้ผ่านตัวอย่างง่ายๆ:

public class ClassA{
public static void main(String args[]){
     //Some gibberish Code...
     String text = ClassB.getString();
     System.out.println("Text is :" + text);
}

}

public class ClassB{
    public static String getString(){
      return "Testing Some Exception";
 }
}

ตอนนี้ให้สมมติว่าซอร์สโค้ด Java สองตัวด้านบนวางไว้ในโฟลเดอร์บางอันให้บอกว่า "NoClassDefinationFoundExceptionDemo"

ตอนนี้เปิดเชลล์ (สมมติว่า Java กำลังติดตั้งอย่างถูกต้องแล้ว)

  1. ไปที่โฟลเดอร์ "NoClassDefinationFoundExceptionDemo"
  2. รวบรวมซอร์สไฟล์ Java javac ClassB javac ClassA
  3. ทั้งสองไฟล์ถูกคอมไพล์สำเร็จและสร้างไฟล์คลาสในโฟลเดอร์เดียวกับ ClassA.class และ ClassB.class
  4. ตอนนี้เนื่องจากเรากำลังเอาชนะ ClassPath ไปยังไดเรกทอรีการทำงานปัจจุบันดังนั้นเราจึงเรียกใช้คำสั่งต่อไปนี้ java -cp ClassA และทำงานได้สำเร็จและคุณจะเห็นผลลัพธ์ในหน้าจอ
  5. ตอนนี้ให้บอกว่าคุณลบไฟล์ ClassB.class จากไดเรกทอรีปัจจุบัน และตอนนี้คุณรันคำสั่งอีกครั้ง java -cp ClassAตอนนี้จะทักทายคุณด้วย NoClassDefFoundException เป็น ClassB ซึ่งเป็นการพึ่งพาสำหรับ ClassA ไม่พบใน classpath (เช่นไดเรกทอรีการทำงานปัจจุบัน)

5

NoClassDefFoundError ใน Java:

ความหมาย:

NoClassDefFoundError จะมาหากมีคลาสอยู่ในช่วงเวลารวบรวม แต่ไม่สามารถใช้ได้ใน java classpath ระหว่างรันไทม์ โดยปกติคุณจะเห็นบรรทัดด้านล่างในบันทึกเมื่อคุณได้รับ NoClassDefFoundError: ข้อยกเว้นในหัวข้อ "main" java.lang.NoClassDefFoundError

สาเหตุที่เป็นไปได้:

  1. คลาสไม่พร้อมใช้งานใน Java Classpath

  2. คุณอาจใช้โปรแกรมของคุณโดยใช้คำสั่ง jar และคลาสไม่ได้กำหนดไว้ในแอตทริบิวต์ ClassPath ของไฟล์รายการ

  3. สคริปต์เริ่มต้นใด ๆ ก็ตามจะแทนที่ตัวแปรสภาพแวดล้อม Classpath

  4. เนื่องจาก NoClassDefFoundError เป็น subclass ของ java.lang.LinkageError มันอาจเกิดขึ้นได้หากหนึ่งในนั้นพึ่งพาเช่นห้องสมุดพื้นเมืองอาจไม่สามารถใช้ได้

  5. ตรวจสอบ java.lang.ExceptionInInialializerError ในล็อกไฟล์ของคุณ NoClassDefFoundError เนื่องจากความล้มเหลวของการเริ่มต้นคงที่ค่อนข้างบ่อย

  6. หากคุณกำลังทำงานในสภาพแวดล้อม J2EE มากกว่าการมองเห็นของ Class ท่ามกลาง Classloader หลายตัวยังสามารถทำให้ java.lang.NoClassDefFoundError ดูตัวอย่างและส่วนสถานการณ์สำหรับการสนทนาโดยละเอียด

ความละเอียดที่เป็นไปได้:

  1. ตรวจสอบว่าคลาส Java ที่จำเป็นทั้งหมดนั้นรวมอยู่ใน classpath ของแอปพลิเคชัน ข้อผิดพลาดที่พบบ่อยที่สุดคือการไม่รวมคลาสที่จำเป็นทั้งหมดก่อนที่จะเริ่มดำเนินการแอปพลิเคชัน Java ที่มีการอ้างอิงในบางไลบรารีภายนอก

  2. คลาสพา ธ ของแอปพลิเคชันนั้นถูกต้อง แต่ตัวแปรสภาพแวดล้อม Classpath จะถูกเขียนทับก่อนการเรียกใช้แอปพลิเคชัน

  3. ตรวจสอบว่าข้อยกเว้นดังกล่าวข้างต้นไม่ปรากฏขึ้นในกองติดตามของแอปพลิเคชันของคุณ

แหล่งข้อมูล:

3 วิธีในการแก้ไข java.lang.NoClassDefFoundError ใน Java J2EE

java.lang.NoClassDefFoundError - วิธีแก้ไขข้อผิดพลาดไม่พบคลาส Def


3

หากโครงการของคุณอยู่ในแพคเกจเหมือนcom.blahcodeและชั้นของคุณเรียกว่าไฟล์ที่รวบรวมอาจถูกขับออกในโครงสร้างไดเรกทอรีเช่นMain ./out/com/blahcode/Main.classนี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับ IntelliJ IDEA

เมื่อพยายามที่จะเรียกใช้จากเชลล์หรือ cmd คุณจะต้องcdไปที่ที่มีcomเป็นไดเรกทอรีย่อย

cd out
java -classpath . com.blahcode.Main

1

หลังจากทำงานกับโครงการ NetBeans เป็นเวลาหลายเดือนฉันก็ได้รับข้อความ NoClassDefFoundError ในไม่ช้าหลังจากได้รับการแจ้งเตือน "หน่วยความจำต่ำ" การสร้างใหม่ทั้งหมดไม่ได้ช่วยอะไร แต่การปิด Netbeans ทั้งหมดและเปิดโครงการอีกครั้งโดยไม่มีรายงานข้อผิดพลาด


1

คำตอบนี้เฉพาะสำหรับ java.lang.NoClassDefFoundError ที่เกิดขึ้นในบริการ :

ทีมของฉันเพิ่งเห็นข้อผิดพลาดนี้หลังจากอัปเกรดรอบต่อนาทีที่ให้บริการ รอบต่อนาทีและซอฟต์แวร์ที่อยู่ด้านในนั้นถูกสร้างขึ้นด้วย Maven ดังนั้นดูเหมือนว่าเรามีการพึ่งพาเวลารวบรวมที่ไม่ได้รวมอยู่ในรอบต่อนาที

อย่างไรก็ตามเมื่อตรวจสอบคลาสที่ไม่พบอยู่ในโมดูลเดียวกันกับหลายคลาสในการติดตามสแต็ก นอกจากนี้นี่ไม่ใช่โมดูลที่เพิ่งถูกเพิ่มเข้ากับบิลด์ ข้อเท็จจริงเหล่านี้ระบุว่าอาจไม่ใช่ปัญหาการพึ่งพา Maven

วิธีแก้ปัญหาในที่สุด: เริ่มบริการใหม่!

ปรากฏว่าการอัพเกรดรอบต่อนาทีทำให้การจัดการไฟล์ของบริการบนไฟล์ jar พื้นฐานไม่ถูกต้อง บริการจากนั้นเห็นคลาสที่ไม่ได้โหลดลงในหน่วยความจำค้นหาในรายการของการจัดการไฟล์ jar และล้มเหลวในการค้นหาเนื่องจากการจัดการไฟล์ที่สามารถโหลดคลาสจากนั้นไม่ถูกต้อง การเริ่มบริการใหม่นั้นบังคับให้โหลดตัวจัดการไฟล์ทั้งหมดใหม่อีกครั้งซึ่งอนุญาตให้โหลดคลาสนั้นที่ไม่พบในหน่วยความจำทันทีหลังจากการอัพเกรดรอบต่อนาที

หวังว่ากรณีเฉพาะช่วยคน


1

ฉันต้องเผชิญกับปัญหาวันนี้ ฉันมีโครงการ Android และหลังจากเปิดใช้งานmultidexโครงการจะไม่เริ่มอีกต่อไป

เหตุผลก็คือฉันลืมที่จะเรียกวิธี multidex เฉพาะที่ควรเพิ่มApplication classและเรียกใช้ก่อนทุกสิ่งอื่น

 MultiDex.install(this);

ทำตามบทช่วยสอนนี้เพื่อเปิดใช้งาน Multidex อย่างถูกต้อง https://developer.android.com/studio/build/multidex.html

คุณควรเพิ่มบรรทัดเหล่านี้ในคลาสแอปพลิเคชันของคุณ

 @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }

1

สำหรับโครงการของฉันสิ่งที่แก้ไขได้คือเบราว์เซอร์ Chrome และ Chromedriver ไม่สามารถใช้งานร่วมกันได้ ฉันมีไดรเวอร์รุ่นเก่ามากที่ไม่สามารถเปิดเบราว์เซอร์ได้ ฉันเพิ่งดาวน์โหลดเวอร์ชันล่าสุดของทั้งคู่และแก้ไขปัญหาได้แล้ว ฉันค้นพบปัญหาได้อย่างไร เนื่องจากฉันรันโครงการของฉันโดยใช้ไดรเวอร์ Firefox พื้นเมืองซีลีเนียมพร้อม FF รุ่นเก่าที่ไม่ติดกับแอปพลิเคชันของฉันฉันจึงรู้ว่าปัญหานั้นไม่เข้ากันระหว่างเบราว์เซอร์กับไดรเวอร์

หวังว่านี่จะช่วยทุกคนที่มีปัญหาคล้ายกันกับฉันซึ่งสร้างข้อความแสดงข้อผิดพลาดเดียวกันนี้ขึ้น


0

สองเซ็นต์ของฉันในห่วงโซ่นี้:

ตรวจสอบให้แน่ใจว่าclasspathมีเส้นทางแบบเต็ม ( /home/user/lib/some_lib.jarแทน~/lib/some_lib.jar) มิฉะนั้นคุณยังสามารถพบNoClassDefFoundErrorข้อผิดพลาดได้


นี่เป็นความจริง แต่ก็มีความซับซ้อนมากกว่า 1) คุณสามารถใช้พา ธ สัมพัทธ์ในคลาสพา ธ แต่ต้องสามารถแก้ไขได้โดย JVM ... ที่สัมพันธ์กับไดเร็กทอรีปัจจุบันของ JVM ซึ่งทำให้พวกเขาเปราะบาง 2) คุณสามารถใช้~และอักขระอื่น ๆ ของเมตาดาต้าเชลล์เมื่อตั้งค่าตัวแปรสภาพแวดล้อมคลาสพา ธ แต่ให้กลไกที่คุณใช้เพื่อตั้งค่าตัวแปรให้ขยายเป็นชื่อพา ธ จริง หากคุณกำลังใช้bashคุณจะได้รับผลลัพธ์ "ผสม" ตัวอย่างเช่นดูสิ่งที่คุณได้รับเมื่อคุณพิมพ์echo ~:~บนบรรทัดคำสั่ง ตัวแรก~ถูกขยายออก แต่ตัวที่สองไม่ใช่
สตีเฟ่นซี

0

ฉันได้รับ NoClassFoundError เมื่อโหลดคลาสโดย runtime class loader ไม่สามารถเข้าถึงคลาสที่โหลดโดย java rootloader แล้ว เนื่องจากตัวโหลดคลาสที่แตกต่างกันอยู่ในโดเมนความปลอดภัยที่แตกต่างกัน (ตามจาวา) jvm จะไม่อนุญาตให้คลาสที่โหลดโดย rootloader ได้รับการแก้ไขในพื้นที่ที่อยู่ของโหลดเดอร์รันไทม์

รันโปรแกรมด้วย 'java -javaagent: tracer.jar [YOUR java ARGS]'

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

// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5

import java.lang.instrument.*;
import java.security.*;

// manifest.mf
// Premain-Class: ClassLoadTracer

// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class

// java -javaagent:tracer.jar  [...]

public class ClassLoadTracer 
{
    public static void premain(String agentArgs, Instrumentation inst) 
    {
        final java.io.PrintStream out = System.out;
        inst.addTransformer(new ClassFileTransformer() {
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

                String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
                out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);

                // dump stack trace of the thread loading class 
                Thread.dumpStack();

                // we just want the original .class bytes to be loaded!
                // we are not instrumenting it...
                return null;
            }
        });
    }
}

0

มันเกิดขึ้นกับฉันใน Android Studio

วิธีแก้ปัญหาที่เหมาะกับฉัน: เพียงแค่รีสตาร์ทสตูดิโอ


0

ฉันมีปัญหาเดียวกันกับการพัฒนา Android โดยใช้ Android studio การแก้ปัญหาที่ให้นั้นเป็นเรื่องทั่วไปและไม่ได้ช่วยฉัน (อย่างน้อยสำหรับฉัน) หลังจากการวิจัยหลายชั่วโมงฉันพบวิธีแก้ปัญหาต่อไปนี้และอาจช่วยนักพัฒนา android ที่กำลังพัฒนาโดยใช้ android studio ปรับเปลี่ยนการตั้งค่าดังนี้ -> Build, Execution, Deployment -> Run ทันที -> ยกเลิกการตรวจสอบตัวเลือกแรก

ด้วยการเปลี่ยนแปลงนี้ฉันพร้อมแล้ว หวังว่านี่จะช่วยเพื่อนนักพัฒนาของฉัน


0

แหล่งที่มาของข้อผิดพลาดสำหรับข้อยกเว้นนี้อาจเกิดจากคำจำกัดความที่ไม่สอดคล้องกันสำหรับ Proguard เช่นขาดหายไป

-libraryJars "path.to.a.missing.jar.library"

สิ่งนี้อธิบายว่าเหตุใดการรวบรวมและการเรียกใช้จึงทำงานได้ดีเนื่องจากมีโถอยู่ในขณะที่การทำความสะอาดและสร้างล้มเหลว อย่าลืมกำหนด jar jar ที่เพิ่งเพิ่มเข้าไปใหม่ในการตั้งค่า proguard!

โปรดทราบว่าข้อความแสดงข้อผิดพลาดจาก Proguard นั้นไม่ได้มาตรฐานจริงๆเพราะพวกเขาสับสนได้ง่ายกับข้อความที่คล้ายกันที่มาถึงเมื่อ jar ไม่ได้อยู่ที่นั่น เฉพาะที่ด้านล่างสุดเท่านั้นที่จะมีผู้แนะนำเล็กน้อยในปัญหา ดังนั้นจึงค่อนข้างตรรกะในการเริ่มค้นหาข้อผิดพลาด classpath แบบดั้งเดิม ฯลฯ แต่สิ่งนี้จะไร้ประโยชน์

เห็นได้ชัดว่าข้อยกเว้น NoClassDefFound จะเป็นผลลัพธ์เมื่อทำงานเช่น jar ที่สามารถเรียกใช้งานได้ซึ่งสร้างขึ้นและไม่มีความสอดคล้องของ proguard บางคนเรียกมันว่าพร่ำ "นรก"


0

ฉันใช้ปลั๊กอิน FileSync สำหรับ Eclipseเพื่อให้ฉันสามารถดีบักสดบน Tomcat & ฉันได้รับNoClassFoundErrorเพราะฉันได้เพิ่มรายการซิงค์สำหรับbinไดเรกทอรีในพื้นที่ทำงาน Eclipse => classesในmetadataสำหรับ Tomcat แต่ยังไม่ได้เพิ่มการซิงค์โฟลเดอร์สำหรับextlibไดเรกทอรีใน Eclipse=>

C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib


0

ฉันกำลังพัฒนาโปรแกรมประยุกต์คราสตามที่เรียกกันว่าRCP (Platform ไคลเอนริช) และฉันได้รับปัญหานี้หลังจาก refactoring (ย้ายหนึ่งคลาสจากปลั๊กอินไปยังใหม่)

การล้างโครงการและการอัพเดท Maven ไม่ได้ช่วยอะไร

ปัญหาเกิดจากBundle-Activatorซึ่งไม่ได้รับการอัพเดตโดยอัตโนมัติ การอัพเดทด้วยตนเองของ Bundle-Activator ภายใต้MANIFEST.MFในปลั๊กอินใหม่ได้แก้ไขปัญหาของฉันแล้ว


0

หากคุณเพิ่มการสนับสนุน multidex ใน android studio แบบนี้:

// To Support MultiDex
implementation 'com.android.support:multidex:1.0.1'

ดังนั้นโซลูชันของคุณจึงขยายจาก MultiDexApplication แทน Application

public class MyApp extends MultiDexApplication {

0

หากคุณใช้มากกว่าหนึ่งโมดูลคุณควรมี

dexOptions {
    preDexLibraries = false
}

ในไฟล์บิลด์ของคุณ


0

ตรวจสอบว่าถ้าคุณมีตัวจัดการแบบคงที่ในชั้นเรียนของคุณ ถ้าเป็นเช่นนั้นโปรดระวังสาเหตุที่ทำให้ตัวจัดการแบบคงที่เท่านั้นสามารถเริ่มต้นในเธรดที่มี looper, ความผิดพลาดอาจถูกทริกเกอร์ด้วยวิธีนี้:

1. ประการแรกให้สร้างอินสแตนซ์ของคลาสในเธรดที่เรียบง่ายและตรวจจับความผิดพลาด

2. จากนั้นเรียกเมธอด field ของ Class ในเธรดหลักคุณจะได้รับ NoClassDefFoundError

นี่คือรหัสทดสอบ:

public class MyClass{
       private static  Handler mHandler = new Handler();
       public static int num = 0;
}

ในวิธีการ onCrete ของกิจกรรมหลักให้เพิ่มส่วนของรหัสทดสอบ:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //test code start
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                MyClass myClass = new MyClass();
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }).start();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    MyClass.num = 3;
    // end of test code
}

มีวิธีง่ายๆในการแก้ไขโดยใช้ handlerThread เพื่อ init handler:

private static Handler mHandler;
private static HandlerThread handlerThread = new HandlerThread("newthread");
static {
    handlerThread.start();
    mHandler = new Handler(handlerThread.getLooper(), mHandlerCB);
}

0

อย่าใช้คลาสทดสอบนอกโมดูล

ฉันไม่ได้มีวิธีแก้ปัญหาเพียงรสชาติของ "ปัจจุบันที่รวบรวมขาดในเวลาทำงาน" อีก

ฉันพยายามใช้วิธีที่สะดวกมากจากคลาสทดสอบ JUnit จากคลาสทดสอบอื่นซึ่งอยู่ในโมดูลอื่น นั่นคือไม่เลยเนื่องจากรหัสทดสอบไม่ได้เป็นส่วนหนึ่งของ jar ที่ทำแพ็กเกจ แต่ฉันไม่รู้เพราะมันปรากฏให้เห็นสำหรับคลาสผู้ใช้จากภายใน Eclipse

ทางออกของฉันคือการวางวิธีการในระดับสาธารณูปโภคที่มีอยู่ที่เป็นส่วนหนึ่งของรหัสการผลิต


0

ในสภาพแวดล้อมของฉันฉันพบปัญหานี้ในการทดสอบหน่วย หลังจากผนวกการอ้างอิงไลบรารีหนึ่งรายการเข้ากับ * .pom นั่นเป็นการแก้ไข

เช่น:

ข้อความผิดพลาด:

java.lang.NoClassDefFoundError: com/abc/def/foo/xyz/Iottt

pom:

<dependency>
    <groupId>com.abc.def</groupId>
    <artifactId>foo</artifactId>
    <scope>test</scope>
</dependency>

0

ฉันได้รับข้อผิดพลาดนี้หลังจากสาขา Git เปลี่ยนไป สำหรับกรณีเฉพาะของ Eclipse มีบรรทัดที่ไม่ได้รับอยู่ในไดเร็กทอรี. settings สำหรับไฟล์ org.eclipse.wst.common.component ตามที่คุณเห็นด้านล่าง

การกู้คืนการพึ่งพาโครงการด้วย Maven Install จะช่วยได้

ป้อนคำอธิบายรูปภาพที่นี่


0

ถ้าคุณใช้gradlewให้ไปที่./gradle/wrapper/gradle-wrapper.propertiesและเปลี่ยนdistributionUrlเป็นเวอร์ชั่นที่ถูกต้องของเกรน

หากคุณกำลังใช้ JDK14 ให้ลอง

distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip

-1

มันเกิดขึ้นมากมายกับอุปกรณ์จีโนมของฉัน ตรวจสอบให้แน่ใจว่าคุณมีหน่วยความจำในปริมาณเพียงพอบนไดรฟ์ที่ติดตั้ง Genymotion


คุณมีการอ้างอิงสำหรับสิ่งนั้นหรือไม่?
ไหวฮาลี

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