Bagaimana cara mengatasi ClassNotFoundException?

106

Saya mencoba menjalankan aplikasi Java, tetapi mendapatkan kesalahan ini:

java.lang.ClassNotFoundException:

Setelah titik dua muncul lokasi kelas yang hilang. Namun, saya tahu bahwa lokasi tersebut tidak ada karena kelas tersebut terletak di tempat lain. Bagaimana cara memperbarui jalur kelas itu? Apakah ini ada hubungannya dengan jalur kelas?

pengguna2426316
sumber
1
Anda harus menambahkan jar yang memiliki kelas hilang untuk classptah yang
Crom
jika kelas Anda memiliki paket, masuk ke folder yang berisi kelas tersebut. misalnya jika paketnya adalah paket test.abc, lalu pergi ke folder sebelum tes dan kemudian lakukan java -cp. test.abc.CLASSNAME (tanpa .class). Jika tidak ada paket, buka folder yang berisi kelas dan katakan java -cp. CLASSNAME
Opsional
Entah sebuah kelas tidak di-deploy ke waktu proses Anda (misalnya jar yang hilang), atau kelas tersebut tidak terlihat dalam pemuat kelas tertentu, periksa alat ini yang membantu memecahkan masalah ini: jhades.org
Angular University
1
Saya juga terkadang mengalami hal ini. Pengecualian ini jelas melanggar aturan menyatakan semua konteks yang diperlukan dalam pesan pengecualian. Itu harus menyebutkan di mana ia mencoba mencari sesuatu, apa yang ada di jalur kelas Anda. Harap buat pesan pengecualian yang lebih baik. Jangan membuat kami mencari informasi yang bisa membantu menyelesaikan masalah.
masterxilo

Jawaban:

32

Jalur kelas Anda rusak (yang merupakan masalah yang sangat umum di dunia Java).

Bergantung pada bagaimana Anda memulai aplikasi, Anda perlu merevisi argumen ke -cp, entri Jalur-Kelas Anda di MANIFEST.MF atau tata letak disk Anda.

Thorbjørn Ravn Andersen
sumber
34
Bisakah Anda lebih spesifik tentang gerhana? Apa yang harus saya lakukan?
pengguna2426316
24
Pertanyaan Anda tidak berisi cukup informasi untuk memberikan jawaban yang lebih spesifik. Pertimbangkan untuk menambahkan itu.
Thorbjørn Ravn Andersen
Resolusi dependensi / ketidaksesuaian versi adalah masalah yang sangat umum di semua lingkungan pemrograman. Kami dapat mengatakan bahwa semua program yang pernah dilakukan adalah menyelesaikan definisi seperti itu ... pertanyaannya selalu apa / di mana definisi itu dan versi mana yang Anda maksud?
masterxilo
2
Saya hanya menekankan bahwa selain dunia Java, semua perangkat lunak memiliki masalah dalam memastikan bahwa versi dependensi yang benar ditemukan. Saya dapat menyebutkan dll-hell, manajer paket, manajer versi, tagihan bahan boot musim semi dan wadah buruh pelabuhan sebagai contoh dari masalah ini dan kemungkinan solusi. Semakin besar pecahan kode asing maka semakin besar masalahnya.
masterxilo
@masterxilo Ya, tapi itu belum tentu menjadi masalah di sini dan Anda mungkin menggonggong pohon yang salah. Semua yang bisa dikatakan adalah bahwa classpath rusak.
Thorbjørn Ravn Andersen
45

Jalur kelas adalah daftar lokasi tempat kelas memuat.

'Lokasi' ini bisa berupa direktori, atau file jar.

Untuk direktori, JVM akan mengikuti pola yang diharapkan untuk memuat kelas. Jika saya memiliki direktori C: / myproject / class di classpath saya, dan saya mencoba memuat kelas com.mycompany.Foo , itu akan mencari di bawah direktori kelas untuk direktori bernama com , lalu di bawah itu direktori bernama mycompany , dan akhirnya itu akan mencari file bernama Foo.class di direktori itu.

Dalam contoh kedua, untuk file jar, itu akan mencari file jar untuk kelas itu. File jar sebenarnya hanyalah kumpulan direktori yang di-zip seperti di atas. Jika Anda mengekstrak file jar, Anda akan mendapatkan banyak direktori dan file kelas mengikuti pola di atas.

Jadi JVM melintasi jalur kelas dari awal sampai akhir mencari definisi kelas saat mencoba memuat definisi kelas. Misalnya, di classpath:

C: / myproject / kelas; C: /myproject/lib/stuff.jar; C: /myproject/lib/otherstuff.jar

JVM akan mencoba melihat kelas direktori terlebih dahulu, lalu masuk stuff.jar dan terakhir di otherstuff.jar .

Saat Anda mendapatkan ClassNotFoundException, itu berarti JVM telah melintasi seluruh jalur kelas dan tidak menemukan kelas yang Anda coba rujuk. Solusinya, seperti yang sering terjadi di dunia Java, adalah memeriksa jalur kelas Anda.

Anda mendefinisikan classpath pada baris perintah dengan mengatakan java -cp dan kemudian classpath Anda. Dalam IDE seperti Eclipse, Anda akan memiliki opsi menu untuk menentukan jalur kelas Anda.

pengguna2000590
sumber
13

Ini solusi terbaik saya temukan sejauh ini.

Misalkan kita memiliki paket yang disebut org.mypackageberisi kelas:

  • HelloWorld (kelas utama)
  • SupportClass
  • UtilClass

dan file yang menentukan paket ini disimpan secara fisik di bawah direktori D:\myprogram(di Windows) atau/home/user/myprogram (di Linux).

Struktur file akan terlihat seperti ini: masukkan deskripsi gambar di sini

Ketika kita memanggil Java, kita tentukan nama aplikasi untuk menjalankan: org.mypackage.HelloWorld. Namun kita juga harus memberi tahu Java di mana mencari file dan direktori yang mendefinisikan paket kita. Jadi untuk meluncurkan program, kita harus menggunakan perintah berikut: masukkan deskripsi gambar di sini

CATATAN: Anda harus menjalankan javaperintah di atas tidak peduli di mana lokasi Anda saat ini. Tapi ini tidak terjadi javac. Untuk kompilasi, Anda bahkan dapat langsung masuk ke direktori tempat Anda menyimpan .javafile dan langsung menjalankannya javac ClassName.java.

Ram Patra
sumber
6

Jika Anda mengetahui jalur kelas atau jar yang berisi kelas tersebut, tambahkan ke classpath Anda saat menjalankannya. Anda dapat menggunakan classpath seperti yang disebutkan di sini:

di Windows

java -classpath .;yourjar.jar YourMainClass

di UNIX / Linux

java -classpath .:yourjar.jar YourMainClass
Juned Ahsan
sumber
4

Coba ini jika Anda menggunakan maven. Saya menggunakan maven untuk proyek saya dan ketika saya melakukan mvn clean installdan mencoba menjalankan program, ia mengeluarkan pengecualian. Jadi, saya membersihkan proyek dan menjalankannya lagi dan berhasil untuk saya.

Saya menggunakan IDE eclipse.

Untuk Pengecualian Kelas Tidak Ditemukan saat menjalankan uji Junit, coba jalankan mvn clean testsekali. Ini akan mengkompilasi semua kelas pengujian.

Arun
sumber
di direktori mana Anda berada saat Anda menjalankan "mvn clean test"? apakah dalam direktori yang sama dengan POM?
TacoB0t
1
Iya. Jalankan dari direktori tempat file pom berada.
Arun
3

Untuk menambahkan lokasi kelas ke jalur kelas Anda melalui baris perintah, cukup tambahkan -cpatau -classpathdan lokasi kelas saat menjalankannya. YAITU

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

Atau jika Anda menjalankan IDE seperti eclipse, Anda dapat mengklik kanan project -> build path -> configure build path dan menambahkan JAR eksternal yang berisi kelas Anda ke jalur build, maka seharusnya berfungsi dengan baik.

invictvs1
sumber
3

Gunakan ';' sebagai pemisah. Jika variabel lingkungan Anda disetel dengan benar, Anda akan melihat pengaturan Anda. Jika PATH dan CLASSPATH Anda benar, windows harus mengenali perintah tersebut. Anda TIDAK perlu me-restart komputer Anda saat menginstal Java.

Kiran S Kulkarni
sumber
5
Itu ada di windows (titik koma), di unix / linux itu adalah ':' (titik dua)
Joeblade
3

Tambahkan jalur lengkap file jar ke CLASSPATH. Dalam penggunaan linux:export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH" . Cara lain yang berhasil (tanpa mengedit CLASSPATH) adalah membuka ritsleting jar di folder proyek saat ini.

Cara tidak berhasil untuk saya:

1) Menggunakan -cpopsi dengan jalur lengkap file jar.

2) Menggunakan -cphanya dengan nama jar ketika berada di folder saat ini

3) Menyalin toples ke folder proyek saat ini

4) Menyalin toples ke lokasi standar toples java (/ usr / share / java)

Solusi ini dilaporkan untuk kelas com.mysql.jdbc.Driver di mysql-connector-java.5 - *. Jar, bekerja di linux dengan OpenJDK versi 1.7

Annonnymous Person
sumber
Hanya membuka ritsleting JAR yang berhasil untuk saya, tidak ada solusi lain yang berhasil
OverCoder
2

Naik ke atas dan hapus pernyataan import jika ada, dan impor ulang kelas. Tetapi jika bukan itu masalahnya, lakukan pembersihan, lalu buat. Apakah Anda menggunakan Netbeans atau Eclipse?

ubi
sumber
2

Saya mengalami ini juga dan mencoba semua solusi lainnya. Saya tidak memiliki file .class di folder HTML saya, saya hanya memiliki file .java. Setelah saya menambahkan file .class, program tersebut bekerja dengan baik.

Jason Robertson
sumber
2
  1. Ini bisa terjadi jika classpath Anda tidak benar

  2. Mari kita menempatkan kelas serializable dan kelas deserializable di bawah nama proyek yang sama. Anda menjalankan kelas serializable, membuat objek serializable di folder tertentu. Sekarang Anda membutuhkan data yang didesearisasi. Sementara itu, jika Anda mengubah nama proyek, itu tidak akan berfungsi. Anda harus menjalankan kelas yang dapat diserialkan terlebih dahulu, kemudian deserialisasi file tersebut.

Omar Faroque Anik
sumber
2

Jika Anda menggunakan maven coba maven perbarui semua proyek dan paksa untuk snapshot. Ini juga akan membersihkan dan membangun kembali semua jalur kelas .. Ini menyelesaikan masalah saya ..

ibrahimgunes
sumber
2

saya baru saja melakukannya

1.Invalidasi cache dan mulai ulang

2. Bangun kembali proyek saya yang memecahkan masalah

Jyoti JK
sumber
1

Saya mencoba menjalankan .jar dari kode C # menggunakan Processkelas. Kode java berjalan dengan sukses dari eclipse tetapi tidak dari studio visual C # dan bahkan mengklik langsung pada file jar, itu selalu berhenti dengan ClassNotFoundException:pengecualian. Solusi untuk saya, adalah mengekspor program java sebagai "file JAR yang dapat dijalankan" daripada "File JAR". Semoga bisa membantu seseorang.

Dani Aya
sumber
1

Ini dapat terjadi di Windows setelah pembaruan java di mana versi lama java SDK tidak ada dan versi baru hadir. Saya akan memeriksa apakah IDE Anda menggunakan versi java SDK yang diinstal (IntelliJ: CTRL + SHIFT + ALT + S)

s5s
sumber
1

Jika Anda telah menambahkan beberapa pustaka (Pihak Ketiga) ** dan Memperluas ** kelas Aplikasi

Kemudian itu mungkin terjadi.

Untuk itu, Anda harus mengatur multiDexEnabled truedan mengganti Applicationkelas perluasan Anda dengan MultiDexApplication.

Ini akan diselesaikan.

Parth Patel
sumber
1

Pertanyaan Umum Dasar - Jawaban Umum Paling Sederhana;)

Dengan adanya informasi ini, saya akan membuat asumsi bahwa Anda mungkin mencoba pendekatan dasar untuk pengkodean, membangun / mengompilasi, dan menjalankan aplikasi konsol sederhana seperti "Hello World", menggunakan beberapa editor teks sederhana dan beberapa Command Shell.

Galat ini terjadi dalam skenario bera:

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

Dengan kata lain, gunakan:

..\SomePath>java HelloWorld

PS Penambahan ekstensi file .class menghasilkan kesalahan yang sama. Pastikan juga untuk memiliki folder bin Java (JDK / JRE) di PATH Variabel Lingkungan sistem operasi. (Cari untuk lebih jelasnya posting lain tentang ini) PPS Apakah asumsi saya benar?

Vasil
sumber
1

Jika Anda menggunakan maven, periksa apakah Anda memiliki plugin ini di 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>

Ini akan menempatkan ketergantungan Anda (alasan pengecualian) ke toples Anda.

FYI : ini akan mencakup semua dependensi yang digelembungkan di toples terakhir

techkuz
sumber
@Arit ditambahkan.
techkuz
0

Dalam kasus saya kelas dilempar sebagai kelas tidak ditemukan pengecualian memiliki properti yang terkait dengan sertifikat ssl. Tutup gerhana dan buka sebagai "Jalankan sebagai Administrator" lalu masalah teratasi. Karena gerhana memiliki izin terkait, itu akan menimbulkan pengecualian semacam itu.

Shaik Elias
sumber
-7

Letakkan semua kode di blok percobaan lalu tangkap pengecualian di blok tangkap

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}
sharukh
sumber
5
Ini tidak menyelesaikan pengecualian. Ini menyembunyikan pengecualian. Lebih lanjut, "e1.getmessage ()" adalah a) kapitalisasi yang salah dari getMessage () dan b) tidak akan melakukan banyak hal karena mengembalikan string dengan pesan dan Anda tidak mencetaknya atau mencatatnya atau apa pun!
IBBoard