ฉันจะแก้ไข ClassNotFoundException ได้อย่างไร


106

ฉันพยายามเรียกใช้แอปพลิเคชัน Java แต่ได้รับข้อผิดพลาดนี้:

java.lang.ClassNotFoundException:

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


1
คุณต้องเพิ่ม jar ที่มีคลาสที่ขาดหายไปใน classptah
Crom

หากชั้นเรียนของคุณมีแพ็กเกจให้ไปที่โฟลเดอร์ที่มีคลาส เช่นถ้า package เป็น package test.abc ให้ไปที่โฟลเดอร์ก่อน test แล้วทำ java -cp test.abc.CLASSNAME (ไม่มี. class) หากไม่มีแพ็คเกจให้ไปที่โฟลเดอร์ที่มีคลาสแล้วพูดว่า java -cp CLASSNAME
ไม่บังคับ

ไม่ว่าคลาสไม่ได้ถูกปรับใช้กับรันไทม์ของคุณ (เช่นไม่มี jar) หรือคลาสไม่ปรากฏในตัวโหลดคลาสที่กำหนดให้ตรวจสอบเครื่องมือนี้ที่ช่วยแก้ไขปัญหาเหล่านี้: jhades.org
Angular University

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

คำตอบ:


32

คลาสพา ธ ของคุณเสีย (ซึ่งเป็นปัญหาที่พบบ่อยมากในโลก Java)

ขึ้นอยู่กับวิธีที่คุณเริ่มต้นแอปพลิเคชันของคุณคุณต้องแก้ไขอาร์กิวเมนต์เป็น-cpรายการเส้นทางคลาสของคุณใน MANIFEST.MF หรือเค้าโครงดิสก์ของคุณ


34
คุณช่วยระบุคราสให้มากขึ้นได้ไหม ฉันต้องทำอะไร?
user2426316

24
คำถามของคุณไม่มีข้อมูลเพียงพอที่จะให้คำตอบที่เฉพาะเจาะจงมากขึ้น พิจารณาเพิ่มเติมว่า
Thorbjørn Ravn Andersen

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

2
ฉันแค่เน้นย้ำว่านอกจากโลกของ Java แล้วซอฟต์แวร์ทั้งหมดยังมีการต่อสู้เพื่อให้แน่ใจว่าพบการอ้างอิงเวอร์ชันที่ถูกต้อง ฉันสามารถพูดถึง dll-hell, ผู้จัดการแพ็คเกจ, ผู้จัดการเวอร์ชัน, ใบเรียกเก็บเงินของวัสดุสปริงบูตและคอนเทนเนอร์นักเทียบท่าเป็นตัวอย่างของปัญหานี้และแนวทางแก้ไขที่เป็นไปได้ เศษส่วนของรหัสแปลกปลอมที่มากขึ้นจะทำให้ปัญหาได้รับมากขึ้น
masterxilo

@masterxilo ใช่ แต่นั่นไม่ใช่ปัญหาที่นี่และคุณอาจเห่าขึ้นต้นไม้ผิด ทั้งหมดที่กล่าวได้คือ classpath เสีย
Thorbjørn Ravn Andersen

45

classpath คือรายการของตำแหน่งที่จะโหลดคลาส

'ตำแหน่งที่ตั้ง' เหล่านี้อาจเป็นไดเร็กทอรีหรือไฟล์ jar

สำหรับไดเร็กทอรี JVM จะเป็นไปตามรูปแบบที่คาดไว้สำหรับการโหลดคลาส ถ้าฉันมีไดเร็กทอรีC: / myproject / คลาสใน classpath ของฉันและฉันพยายามโหลดคลาสcom.mycompany.Fooมันจะดูภายใต้ไดเร็กทอรีคลาสสำหรับไดเร็กทอรีที่เรียกว่าcomจากนั้นภายใต้ไดเร็กทอรีที่เรียกว่าmycompanyและ ในที่สุดก็จะค้นหาไฟล์ชื่อFoo.classในไดเร็กทอรีนั้น

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

ดังนั้น JVM จะข้ามผ่านคลาสพา ธ ตั้งแต่ต้นจนจบเพื่อค้นหานิยามของคลาสเมื่อพยายามโหลดนิยามคลาส ตัวอย่างเช่นใน classpath:

C: / myproject / คลาส; C: /myproject/lib/stuff.jar; C: /myproject/lib/otherstuff.jar

JVM ที่จะพยายามที่จะมองในไดเรกทอรีเรียนก่อนแล้วในstuff.jarและในที่สุดotherstuff.jar

เมื่อคุณได้รับ ClassNotFoundException นั่นหมายความว่า JVM ได้ข้ามผ่านคลาสพา ธ ทั้งหมดและไม่พบคลาสที่คุณพยายามอ้างอิง วิธีแก้ปัญหาเช่นเดียวกับในโลก Java คือการตรวจสอบคลาสพา ธ ของคุณ

คุณกำหนด classpath บนบรรทัดคำสั่งโดยพูดjava -cpแล้วตามด้วย classpath ของคุณ ใน IDE เช่น Eclipse คุณจะมีตัวเลือกเมนูเพื่อระบุ classpath ของคุณ


13

นี่เป็นทางออกที่ดีที่สุดที่ฉันพบ

สมมติว่าเรามีแพ็คเกจที่เรียกว่าorg.mypackageมีคลาส:

  • HelloWorld (ชั้นหลัก)
  • SupportClass
  • UtilClass

และไฟล์ที่กำหนดแพ็กเกจนี้จะถูกเก็บไว้ในไดเร็กทอรีD:\myprogram(บน Windows) หรือ/home/user/myprogram(บน Linux)

โครงสร้างไฟล์จะมีลักษณะดังนี้: ป้อนคำอธิบายภาพที่นี่

เมื่อเราเรียกใช้ Java org.mypackage.HelloWorldเราระบุชื่อของแอพลิเคชันในการทำงาน: อย่างไรก็ตามเราต้องบอก Java ด้วยว่าจะค้นหาไฟล์และไดเร็กทอรีที่กำหนดแพ็คเกจของเราได้ที่ไหน ดังนั้นในการเปิดโปรแกรมเราต้องใช้คำสั่งต่อไปนี้: ป้อนคำอธิบายภาพที่นี่

หมายเหตุ:คุณต้องดำเนินการตามjavaคำสั่งข้างต้นไม่ว่าตำแหน่งปัจจุบันของคุณจะเป็นอย่างไร javacแต่กรณีนี้ไม่ได้สำหรับ สำหรับการรวบรวมคุณยังสามารถโดยตรงไปลงในไดเรกทอรีที่คุณมีของคุณไฟล์และดำเนินการโดยตรง.javajavac ClassName.java


6

หากคุณทราบเส้นทางของคลาสหรือ jar ที่มีคลาสให้เพิ่มลงใน classpath ของคุณในขณะที่รัน คุณสามารถใช้ classpath ดังที่กล่าวไว้ที่นี่:

บน Windows

java -classpath .;yourjar.jar YourMainClass

บน UNIX / Linux

java -classpath .:yourjar.jar YourMainClass

4

ลองใช้สิ่งเหล่านี้หากคุณใช้ maven ฉันใช้ maven สำหรับโปรเจ็กต์ของฉันและเมื่อฉันทำmvn clean installและพยายามเรียกใช้โปรแกรมมันจะทำให้เกิดข้อยกเว้น ดังนั้นฉันทำความสะอาดโครงการและเรียกใช้อีกครั้งและมันก็ใช้ได้สำหรับฉัน

ฉันใช้ eclipse IDE

สำหรับ Class Not Found Exception เมื่อเรียกใช้ Junit test ให้ลองรันmvn clean testหนึ่งครั้ง มันจะรวบรวมคลาสทดสอบทั้งหมด


คุณอยู่ในไดเรกทอรีใดเมื่อเรียกใช้ "mvn clean test" อยู่ในไดเร็กทอรีเดียวกับ POM หรือไม่
TacoB0t

1
ใช่. เรียกใช้จากไดเร็กทอรีที่มีไฟล์ pom อยู่
อรุณ

3

หากต้องการเพิ่มตำแหน่งของชั้นเรียนในพา ธ คลาสของคุณผ่านทางบรรทัดคำสั่งเพียงแค่เพิ่ม-cpหรือ-classpathและตำแหน่งของชั้นเรียนในขณะที่เรียกใช้ IE

java -cp "c:/location/of/file" YourProgram

หรือถ้าคุณกำลังเรียกใช้ IDE เช่น eclipse คุณสามารถคลิกขวาที่project -> build path -> configure build path และเพิ่ม JAR ภายนอกที่มีคลาสของคุณไปยังเส้นทางการสร้างก็ควรจะทำงานได้ดี


3

ใช้ ';' เป็นตัวคั่น หากตัวแปรสภาพแวดล้อมของคุณตั้งค่าอย่างถูกต้องคุณควรเห็นการตั้งค่าของคุณ ถ้า PATH และ CLASSPATH ของคุณถูกต้อง windows ควรรู้จักคำสั่งเหล่านั้น คุณไม่จำเป็นต้องรีสตาร์ทคอมพิวเตอร์เมื่อติดตั้ง Java


5
ที่อยู่บน windows (เซมิโคลอน) บน unix / linux มันคือ ':' (โคลอน)
Joeblade

3

เพิ่มพา ธ แบบเต็มของไฟล์ jar ไปยัง CLASSPATH ในการใช้ลินุกซ์: export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH". วิธีอื่นที่ใช้ได้ผล (โดยไม่ต้องแก้ไข CLASSPATH) คือการคลายซิป jar ในโฟลเดอร์โครงการปัจจุบัน

วิธีต่างๆไม่ได้ผลสำหรับฉัน:

1) ใช้-cpตัวเลือกที่มีเส้นทางเต็มของไฟล์ jar

2) ใช้-cpเฉพาะชื่อ jar เมื่ออยู่ในโฟลเดอร์ปัจจุบัน

3) คัดลอก jar ไปยังโฟลเดอร์โครงการปัจจุบัน

4) คัดลอก jar ไปยังตำแหน่งมาตรฐานของ java jars (/ usr / share / java)

โซลูชันนี้รายงานสำหรับคลาส com.mysql.jdbc.Driver ใน mysql-connector-java.5 - *. jar ที่ทำงานบน linux พร้อม OpenJDK เวอร์ชัน 1.7


การคลายซิปเท่านั้นที่ใช้งานได้สำหรับฉันไม่มีวิธีแก้ปัญหาอื่นใดทำได้
OverCoder

2

ขึ้นไปด้านบนสุดและลบคำสั่งนำเข้าหากมีอยู่และนำเข้าคลาสอีกครั้ง แต่ถ้าไม่เป็นเช่นนั้นให้ทำความสะอาดแล้วสร้าง คุณใช้ Netbeans หรือ Eclipse?


2

ฉันพบสิ่งนี้เช่นกันและลองวิธีแก้ปัญหาอื่น ๆ ทั้งหมด ฉันไม่มีไฟล์. class ในโฟลเดอร์ HTML ของฉันฉันมีแค่ไฟล์. java เมื่อฉันเพิ่มไฟล์. class โปรแกรมก็ทำงานได้ดี


2
  1. อาจเกิดขึ้นได้หาก classpath ของคุณไม่ถูกต้อง

  2. ให้เราวางคลาสที่ต่อเนื่องกันได้และคลาส deserialhable ภายใต้ชื่อโครงการเดียวกัน คุณเรียกใช้คลาสซีเรียลได้โดยสร้างอ็อบเจ็กต์ที่ทำให้เป็นอนุกรมในโฟลเดอร์เฉพาะ ตอนนี้คุณต้องการข้อมูล desearialized ในระหว่างนี้หากคุณเปลี่ยนชื่อโครงการจะไม่สามารถใช้งานได้ คุณต้องเรียกใช้คลาสที่ทำให้เป็นอนุกรมได้ก่อนจากนั้นจึงแยกไฟล์ออกจากระบบ


2

หากคุณใช้ maven ให้พยายามอัปเดตโปรเจ็กต์ทั้งหมดและบังคับสำหรับสแน็ปช็อต มันจะทำความสะอาดเช่นกันและสร้างคลาสพา ธ ใหม่ทั้งหมด .. มันช่วยแก้ปัญหาของฉันได้ ..


2

ฉันเพิ่งทำ

1. ทำให้แคชไม่ถูกต้องและรีสตาร์ท

2. สร้างโครงการของฉันขึ้นใหม่ซึ่งช่วยแก้ปัญหาได้


1

ฉันพยายามเรียกใช้. jar จากรหัส C # โดยใช้Processคลาส โค้ด java ทำงานได้สำเร็จจาก eclipse แต่ไม่ได้มาจาก C # visual studio และแม้กระทั่งคลิกที่ไฟล์ jar โดยตรงมันก็หยุดเสมอโดยมีClassNotFoundException:ข้อยกเว้น วิธีแก้ปัญหาสำหรับฉันคือส่งออกโปรแกรม java เป็น "ไฟล์ JAR ที่รันได้" แทน "ไฟล์ JAR" หวังว่ามันจะช่วยใครสักคนได้


1

สิ่งนี้สามารถเกิดขึ้นได้ใน Windows หลังจากการอัปเดต java โดยที่ java SDK เวอร์ชันเก่าหายไปและมีเวอร์ชันใหม่อยู่ ฉันจะตรวจสอบว่า IDE ของคุณใช้ java SDK เวอร์ชันที่ติดตั้งไว้หรือไม่ (IntelliJ: CTRL + SHIFT + ALT + S)


1

หากคุณได้เพิ่มไลบรารี (บุคคลที่สาม) ** และขยาย **คลาสแอปพลิเคชันหลายรายการ

แล้วมันอาจจะเกิดขึ้น

เพื่อที่คุณจะต้องตั้งค่าmultiDexEnabled trueและแทนที่ขยายชั้นเรียนกับApplication MultiDexApplication

มันจะคลี่คลาย


1

คำถามทั่วไปพื้นฐาน - คำตอบทั่วไปที่ง่ายที่สุด;)

จากข้อมูลที่ฉันจะตั้งสมมติฐานว่าคุณอาจกำลังลองใช้วิธีการพื้นฐานในการเขียนโค้ดสร้าง / รวบรวมและเรียกใช้แอปคอนโซลง่ายๆเช่น "Hello World" โดยใช้โปรแกรมแก้ไขข้อความแบบธรรมดาและ Command Shell

ข้อผิดพลาดนี้เกิดขึ้นในสถานการณ์การล่มสลาย:

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

กล่าวอีกนัยหนึ่งใช้:

..\SomePath>java HelloWorld

ปล. การเพิ่มไฟล์นามสกุล. class ทำให้เกิดความผิดพลาดเหมือนกัน ตรวจสอบให้แน่ใจว่ามีโฟลเดอร์ bin ของ Java (JDK / JRE) ใน PATH ของ Environment Variables ของระบบปฏิบัติการ (ค้นหารายละเอียดเพิ่มเติมโพสต์อื่น ๆ เกี่ยวกับเรื่องนี้) PPS ฉันถูกต้องในสมมติฐาน / s ของฉันหรือไม่?


1

หากคุณใช้ maven ตรวจสอบว่าคุณมีปลั๊กอินนี้ในpom.xml:

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade goal into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

มันจะทำให้การพึ่งพาของคุณ (เหตุผลยกเว้น) ไปที่โถของคุณ

FYI : สิ่งนี้จะรวมการอ้างอิงทั้งหมดที่สูงเกินจริงในโถสุดท้าย


@ อ. จิตรกล่าวเสริม.
techkuz

0

ในกรณีของฉันคลาสที่ถูกโยนเป็นคลาสไม่พบข้อยกเว้นมีคุณสมบัติที่เกี่ยวข้องกับใบรับรอง ssl ปิด eclipse และเปิดเป็น“ Run as Administrator” จากนั้นปัญหาได้รับการแก้ไข เนื่องจากคราสมีปัญหาเกี่ยวกับการอนุญาตจึงทำให้เกิดข้อยกเว้นดังกล่าว


-8

ใส่รหัสทั้งหมดใน try block จากนั้นจับข้อยกเว้นในบล็อก catch

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}

5
สิ่งนี้ไม่สามารถแก้ไขข้อยกเว้นได้ สิ่งนี้ซ่อนข้อยกเว้น นอกจากนี้ "e1.getmessage ()" คือ a) การใช้ getMessage () และ b) ตัวพิมพ์ใหญ่ไม่ถูกต้องจะไม่ทำมากนักเนื่องจากส่งคืนสตริงพร้อมข้อความและคุณไม่ได้พิมพ์หรือบันทึกหรือสิ่งใด ๆ !
IBBoard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.