Apa "tidak Bisa menemukan atau beban utama kelas" berarti?

Masalah umum yang baru Java developers pengalaman adalah bahwa program-program mereka gagal untuk menjalankan dengan pesan error: tidak Bisa menemukan atau beban utama kelas ...

Apa artinya ini, apa penyebabnya, dan bagaimana anda harus memperbaikinya?

Mengomentari pertanyaan (1)
Larutan

Di java <kelas-nama> sintaks perintah

Pertama-tama, anda perlu memahami cara yang benar untuk memulai program dengan menggunakan jawa (atau javaw) perintah. Normal sintaks1 adalah ini:

    java [  ... ]  [ ...]

di mana <option> adalah opsi baris perintah (mulai dengan "-" karakter), <kelas-nama> fully qualified Jawa nama kelas, dan <argumen> yang sewenang-wenang argumen baris perintah yang akan diteruskan ke aplikasi anda. 1 - Ada kedua sintaks untuk "eksekusi" file JAR yang akan saya jelaskan di bawah. Nama lengkap dan memenuhi syarat (FQN) untuk kelas konvensional tertulis seperti yang anda lakukan di pulau Jawa kode sumber; mis.

    packagename.packagename2.packagename3.ClassName

Namun beberapa versi dari jawa perintah memungkinkan anda untuk menggunakan garis miring daripada periode; mis.

    packagename/packagename2/packagename3/ClassName

yang (membingungkan) terlihat seperti file path, tapi isn't satu. Perhatikan bahwa istilah fully qualified name standar terminologi Jawa ... bukan sesuatu yang saya hanya dibuat untuk membingungkan anda :-) Berikut adalah contoh dari apa yang jawa command akan terlihat seperti:

    java -Xmx100m com.acme.example.ListUsers fred joe bert

Hal di atas akan menyebabkan jawa perintah untuk melakukan hal-hal berikut:

  1. Pencarian untuk dikompilasi versi com.acme.contoh.ListUsers kelas.
  2. Beban kelas.
  3. Periksa bahwa kelas memiliki main dengan metode tanda tangan, tipe kembali dan pengubah yang diberikan oleh public static void main(String[]). (Catatan, metode argumen's nama adalah TIDAK bagian dari tanda tangan.)
  4. Memanggil metode yang lewat itu argumen baris perintah ("fred", "joe", "bert") sebagai String[]. Alasan mengapa pulau Jawa tidak dapat menemukan kelas

    Ketika anda mendapatkan pesan "tidak Bisa menemukan atau beban utama kelas ...", yang berarti bahwa langkah pertama telah gagal. The jawa perintah tidak dapat menemukan kelas. Dan memang, "..." di pesan akan menjadi fully qualified nama kelas java adalah mencari. Jadi mengapa itu tidak dapat menemukan kelas? Alasan #1 - anda membuat kesalahan dengan classname argumen

    Pertama kemungkinan penyebabnya adalah bahwa anda mungkin telah memberikan salah nama kelas. (Atau ... kanan nama kelas, tetapi dalam bentuk yang salah.) Mengingat contoh di atas, berikut ini adalah berbagai cara yang salah untuk menentukan nama kelas: Contoh #1 - nama kelas sederhana:

jawa ListUser Ketika kelas dinyatakan dalam paket seperti com.acme.contoh, maka anda harus menggunakan full classname termasuk nama paket di jawa perintah; mis. jawa com.acme.contoh.ListUser Contoh #2 - nama file atau path daripada nama kelas: jawa ListUser.class jawa com/acme/example/ListUser.class Contoh #3 - nama kelas dengan casing yang salah: jawa com.acme.contoh.listuser Contoh #4 - typo jawa com.acme.contoh.mistuser Contoh #5 - sumber file jawa ListUser.java Contoh #6 - anda lupa nama kelas sepenuhnya jawa banyak argumen Alasan #2 - aplikasi's classpath adalah salah ditentukan

Kedua kemungkinan penyebabnya adalah bahwa nama kelas adalah benar, tetapi bahwa jawa perintah tidak dapat menemukan kelas. Untuk memahami hal ini, anda perlu memahami konsep "classpath". Hal ini dijelaskan nah oleh Oracle dokumentasi:

  1. Membaca tiga dokumen terkait di atas. (Ya ... BACA mereka. Adalah penting bahwa Java programmer memahami setidaknya dasar-dasar bagaimana classpath Java mekanisme ini bekerja.)
  2. Terlihat pada baris perintah dan / atau variabel lingkungan CLASSPATH yang berlaku ketika anda menjalankan jawa perintah. Periksa bahwa nama direktori dan file JAR nama yang benar.
  3. Jika ada relatif nama path dalam classpath, periksa bahwa mereka menyelesaikan dengan benar ... dari direktori saat ini yang berlaku ketika anda menjalankan jawa perintah.
  4. Periksa bahwa kelas (yang disebutkan dalam pesan galat) dapat terletak pada efektif classpath.
  5. Perhatikan bahwa classpath sintaks yang berbeda * untuk Windows vs Linux dan Mac OS. (Classpath pemisah ; pada Windows dan : pada orang lain. Jika anda menggunakan salah pemisah untuk platform anda, anda memenangkan't mendapatkan eksplisit pesan kesalahan. Sebagai gantinya, anda akan mendapatkan tidak ada berkas atau direktori pada jalan yang akan diam-diam diabaikan.) Alasan #2a - direktori yang salah adalah pada classpath

    Ketika anda menempatkan sebuah direktori pada classpath, itu notionally sesuai dengan akar yang memenuhi syarat ruang nama. Kelas-kelas yang terletak di dalam struktur direktori di bawah root, dengan pemetaan nama lengkap dan memenuhi syarat untuk pathname. Jadi misalnya, jika "/usr/local/acme/kelas" pada kelas jalan, maka ketika JVM terlihat untuk kelas yang disebut com.acme.contoh.Foon, maka akan terlihat untuk ".kelas" file dengan path:

  /usr/local/acme/classes/com/acme/example/Foon.class

Jika anda telah menempatkan "/usr/local/acme/kelas/com/acme/contoh" pada classpath, maka JVM tidak't dapat menemukan kelas. Alasan #2b - subdirektori jalan doesn't pertandingan FQN

Jika kelas anda FQN adalah com.acme.contoh.Foon, maka JVM akan mencari "Foon.kelas" di direktori "com/acme/contoh":

  • Jika anda struktur direktori doesn't mencocokkan paket penamaan sesuai pola di atas, JVM tidak't menemukan kelas anda.
  • Jika anda mencoba ganti nama kelas dengan bergerak, yang akan gagal juga ... tapi pengecualian stacktrace akan berbeda. Hal ini bertanggung jawab untuk mengatakan sesuatu seperti ini: Disebabkan oleh: java.lang.NoClassDefFoundError: <jalan> (salah nama: <nama>) karena FQN di kelas file doesn't sesuai dengan apa yang kelas loader mengharapkan untuk menemukan. Untuk memberikan contoh konkret, mengandaikan bahwa:
  • anda ingin menjalankan com.acme.contoh.Foon kelas,
  • full path file /usr/local/acme/classes/com/acme/example/Foon.class,
  • direktori kerja anda saat ini adalah /usr/local/acme/kelas/com/acme/contoh/, maka:
# wrong, FQN is needed
java Foon

# wrong, there is no `com/acme/example` folder in the current working directory
java com.acme.example.Foon

# wrong, similar to above
java -classpath . com.acme.example.Foon

# fine; relative classpath set
java -classpath ../../.. com.acme.example.Foon

# fine; absolute classpath set
java -classpath /usr/local/acme/classes com.acme.example.Foon

Catatan:

  • The -classpath pilihan dapat disingkat menjadi -cp di sebagian besar Jawa rilis. Periksa masing-masing entri manual untuk jawa, javac dan sebagainya.

  • Berpikir dengan hati-hati ketika memilih antara nama path absolut dan relatif dalam classpaths. Ingat bahwa relative pathname mungkin "break" jika arus perubahan direktori. Alasan #2c - dependensi yang hilang dari classpath

    Classpath harus memuat semua lain-lain (non-system) kelas bahwa aplikasi anda tergantung pada. (Sistem kelas yang terletak secara otomatis, dan anda jarang perlu menyibukkan diri dengan hal ini.) Untuk kelas utama untuk memuat dengan benar, JVM kebutuhan untuk menemukan:

  • kelas itu sendiri.

  • semua kelas dan interface dalam superclass hirarki (misalnya melihat https://stackoverflow.com/questions/42880748)

  • semua kelas dan interface yang disebut dengan sarana variabel atau deklarasi variabel, atau metode panggilan atau bidang akses ekspresi. (Catatan: JLS dan JVM spesifikasi memungkinkan beberapa ruang lingkup untuk JVM untuk memuat kelas-kelas "malas", dan hal ini dapat mempengaruhi ketika classloader pengecualian dilemparkan.) Alasan #3 - kelas yang telah dinyatakan dalam salah paket

    Itu kadang-kadang terjadi bahwa seseorang menempatkan file kode sumber ke dalam folder yang salah dalam kode sumber mereka pohon, atau mereka meninggalkan paket deklarasi. Jika anda melakukan hal ini dalam sebuah IDE, IDE's compiler akan memberitahu anda tentang hal ini segera. Demikian pula jika anda menggunakan layak Jawa membangun alat, alat akan menjalankan javac dengan cara yang akan mendeteksi masalah. Namun, jika anda membangun kode Java dengan tangan, anda dapat melakukannya sedemikian rupa sehingga compiler tidak't melihat masalah, dan menghasilkan ".kelas" file tidak di tempat yang anda harapkan untuk menjadi. Masih bisa't menemukan masalah?

    Ada banyak hal yang harus diperiksa, dan sangat mudah untuk kehilangan sesuatu. Mencoba menambahkan -Xdiag pilihan ke jawa command line (sebagai hal pertama setelah java). Ini akan menampilkan berbagai hal tentang kelas loading, dan ini bisa memberikan anda petunjuk tentang apa masalah sebenarnya. Juga, mempertimbangkan masalah yang mungkin disebabkan oleh menyalin dan menyisipkan terlihat atau karakter non-ASCII dari situs web, dokumen, dan sebagainya. Dan mempertimbangkan "homoglyphs", adalah dua huruf atau simbol-simbol yang terlihat sama ... tapi aren't.

    Di java -jar <file jar> sintaks

    Alternatif sintaks yang digunakan untuk "eksekusi" file JAR adalah sebagai berikut:

  java [  ... ] -jar  [ ...]

misalnya

  java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred

Dalam hal ini nama dari entry-point kelas (yaitu com.acme.contoh.ListUser) dan classpath yang ditentukan dalam MANIFEST dari file JAR.

IDEs

Khas Jawa IDE memiliki dukungan untuk menjalankan aplikasi Java pada IDE JVM itu sendiri atau pada anak JVM. Ini adalah umumnya kekebalan tubuh dari ini pengecualian tertentu, karena IDE menggunakan mekanisme sendiri untuk membangun runtime classpath, mengidentifikasi kelas utama dan membuat jawa command line. Namun hal ini masih mungkin untuk pengecualian ini terjadi, jika anda melakukan hal-hal di belakang punggung IDE. Misalnya, jika sebelumnya anda telah menyiapkan sebuah Aplikasi Launcher untuk aplikasi Java di Eclipse, dan anda kemudian pindah file JAR yang berisi "main" kelas untuk tempat yang berbeda di dalam sistem berkas tanpa memberitahu Eclipse, Gerhana tanpa disadari akan meluncurkan JVM dengan salah classpath. Singkatnya, jika anda mendapatkan masalah ini dalam sebuah IDE, periksa hal-hal seperti basi IDE negara, rusak referensi proyek atau rusak launcher konfigurasi. Hal ini juga memungkinkan untuk sebuah IDE untuk hanya bingung. IDE's sangat rumit buah perangkat lunak yang terdiri dari banyak bagian-bagian yang saling berinteraksi. Banyak dari bagian-bagian ini mengadopsi caching berbagai strategi dalam rangka untuk membuat IDE secara keseluruhan responsif. Ini dapat kadang-kadang bisa salah, dan salah satu gejala yang mungkin adalah masalah ketika meluncurkan aplikasi. Jika anda menduga hal ini bisa terjadi, ada baiknya mencoba hal-hal berbohong restart IDE anda dan membangun kembali proyek tersebut.

Referensi Lain

Komentar (11)

Jika anda source code nama HelloWorld.java anda, kode dikompilasi akan HelloWorld.class.

Anda akan mendapatkan kesalahan itu jika anda menyebutnya menggunakan:

java HelloWorld.class

Sebaliknya, gunakan ini:

java HelloWorld
Komentar (8)

Jika anda kelas dalam paket maka anda harus cd ke direktori root dari proyek anda dan jalankan menggunakan nama lengkap dan memenuhi syarat kelas (packageName.MainClassName).

Contoh:

Kelas saya ada di sini:

D:\project\com\cse\

Nama lengkap dan memenuhi syarat dari saya kelas utama adalah:

com.cse.Main

Jadi saya cd kembali ke root directory project:

D:\project

Kemudian mengeluarkan jawa perintah:

java com.cse.Main

Jawaban ini adalah untuk menyelamatkan newbie programmer java dari frustrasi yang disebabkan oleh kesalahan umum, saya sarankan anda membaca jawaban yang diterima untuk lebih dalam pengetahuan yang mendalam tentang java classpath.

Komentar (2)

Jika anda menentukan kelas utama dan metode utama dalam paket, anda harus berjalan di atas hirarki direktori, dengan menggunakan nama lengkap kelas (packageName.MainClassName).

Misalnya ada sebuah file kode sumber (Main.java):

package com.test;

public class Main {

    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}

Untuk menjalankan kode ini, anda harus menempatkan Main.Class dalam paket seperti direktori ./com/test/Main.Java. Dan di direktori root menggunakan jawa com.tes.Utama.

Komentar (6)

Ketika kode yang sama bekerja pada salah satu PC, tapi itu menunjukkan kesalahan di tempat lain, solusi terbaik yang pernah ditemukan adalah kompilasi seperti berikut:

javac HelloWorld.java
java -cp . HelloWorld
Komentar (5)

Apa yang membantu saya adalah menentukan classpath pada baris perintah, misalnya:

  1. Membuat folder baru, C:\temp

  2. Membuat file Temp.java dalam C:\temp, dengan kelas berikut di dalamnya:

public class Temp { public static void main(String args[]) { Sistem.keluar.println(args[0]); } }

  1. Buka command line di folder C:\temp, dan menulis perintah berikut untuk mengkompilasi Temp kelas:

javac Temp.java

  1. Menjalankan dihimpun Jawa kelas, menambahkan -classpath pilihan untuk membiarkan JRE tahu di mana untuk menemukan hotel:

java -classpath C:\temp Temp Hello!

Komentar (7)

Menurut pesan kesalahan ("tidak Bisa menemukan atau beban utama kelas"), ada dua kategori masalah:

  1. Kelas utama tidak bisa menemukan
  2. Kelas utama tidak bisa dimuat (hal ini tidak sepenuhnya dibahas dalam jawaban yang diterima)

Kelas utama tidak bisa menemukan bila ada typo atau salah sintaks dalam memenuhi syarat nama kelas atau tidak ada pada classpath.

Kelas utama tidak bisa dimuat ketika kelas tidak dapat dimulai, biasanya kelas utama meluas kelas lainnya dan kelas yang tidak ada di hotel classpath.

Misalnya:

public class YourMain extends org.apache.camel.spring.Main

Jika unta-musim semi tidak termasuk, ini kesalahan yang akan dilaporkan.

Komentar (11)

Aku punya kesalahan seperti dalam kasus ini:

java -cp lib.jar com.mypackage.Main

Ia bekerja dengan ; untuk Windows dan : untuk Unix:

java -cp lib.jar; com.mypackage.Main
Komentar (2)

Gunakan perintah ini:

java -cp . [PACKAGE.]CLASSNAME

Contoh: Jika anda adalah classname Hello.class dibuat dari Hello.java kemudian gunakan perintah di bawah ini:

java -cp . Hello

Jika file anda Hello.java di dalam package com.demo kemudian gunakan perintah di bawah ini

java -cp . com.demo.Hello

Dengan JDK 8 banyak kali terjadi bahwa kelas file ada di folder yang sama, tapi jawa perintah mengharapkan classpath dan untuk alasan ini kami tambahkan -cp . untuk mengambil folder saat ini sebagai referensi untuk classpath.

Komentar (8)

Kadang-kadang apa yang mungkin menyebabkan masalah ini tidak ada hubungannya dengan kelas utama, dan saya harus menemukan cara yang keras. Itu dirujuk perpustakaan itu aku pindah, dan itu memberi saya:

tidak Bisa menemukan atau beban utama kelas xxx Linux

Aku hanya menghapus referensi itu, menambahkan lagi, dan itu bekerja dengan baik lagi.

Komentar (5)

Mencoba -Xdiag.

Steve C's jawaban meliputi kasus yang mungkin baik, tapi kadang-kadang untuk menentukan apakah kelas tidak bisa menemukan atau dimuat mungkin tidak akan semudah itu. Menggunakan java -Xdiag (sejak JDK 7). Ini cetakan yang bagus stacktrace yang memberikan petunjuk untuk apa pesan tidak Dapat menemukan atau beban utama kelas pesan berarti.

Misalnya, hal ini dapat mengarahkan anda ke kelas-kelas lain yang digunakan oleh kelas utama yang tidak bisa ditemukan dan dicegah kelas utama untuk dapat dimuat.

Komentar (0)

Dalam hal ini anda memiliki:

tidak Bisa menemukan atau beban utama kelas ?classpath

It's karena anda menggunakan "-classpath", tapi dash adalah tidak sama dash digunakan oleh jawa pada command prompt. Aku punya masalah ini di-copy paste dari Notepad untuk cmd.

Komentar (1)

Aku punya masalah yang sama dan akhirnya menemukan kesalahan saya :) Saya menggunakan perintah ini untuk menyusun dan itu bekerja dengan benar:

javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.java

Namun perintah ini tidak bekerja untuk saya (saya tidak bisa menemukan atau beban kelas utama, qrcode):

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode

Akhirnya saya hanya menambahkan ':' karakter di akhir classpath dan masalah ini diselesaikan:

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode
Komentar (0)

Dalam kasus saya, kesalahan ini muncul karena aku telah disediakan sumber file nama bukan nama kelas.

Kita perlu menyediakan nama kelas yang berisi metode utama untuk penerjemah.

Komentar (1)

Ini mungkin bisa membantu anda jika anda kasus khusus seperti saya: sebagai pemula saya juga berlari ke dalam masalah ini ketika saya mencoba untuk menjalankan program Java.

Saya membuatnya seperti ini:

javac HelloWorld.java

Dan saya mencoba untuk menjalankan juga dengan ekstensi yang sama:

java Helloworld.java

Ketika saya dihapus .jawa dan menulis ulang perintah seperti java HelloWorld, program ini berlari dengan sempurna. :)

Komentar (2)

Kelas file location: C:\test\com\company

Nama File: Main.class

Memenuhi syarat nama kelas: com.perusahaan.Utama

Perintah baris perintah:

java  -classpath "C:\test" com.company.Main

Perhatikan di sini bahwa kelas jalan TIDAK mencakup \com\perusahaan

Komentar (0)

Saya menghabiskan jumlah yang layak waktu mencoba untuk memecahkan masalah ini. Saya berpikir bahwa saya entah bagaimana pengaturan saya classpath salah, tetapi masalahnya adalah bahwa saya mengetik:

java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  

bukannya:

java -cp C:/java/MyClasses utilities/myapp/Cool   

Saya pikir makna yang sepenuhnya memenuhi syarat dimaksudkan untuk mencakup nama path lengkap daripada paket lengkap nama.

Komentar (2)

Set pertama jalan menggunakan perintah ini;

set path="paste the set path address"

Kemudian anda perlu untuk memuat program ini. Jenis "cd (nama folder)" di disimpan drive dan kompilasi. Misalnya, jika saya program yang tersimpan di drive D, jenis "D" tekan enter dan ketik " cd (nama folder)".

Komentar (3)

Apa tetap masalah dalam kasus saya adalah:

Klik kanan pada proyek/kelas yang ingin anda jalankan, maka Run As-> RunKonfigurasi. Maka anda harus menghapus konfigurasi yang ada atau menambahkan yang baru dengan cara sebagai berikut:

buka Classpath tab, kemudian klik pada Advanced... tombol kemudian tambahkan folderbin proyek anda.

Komentar (0)

Semua jawaban di sini juga diarahkan untuk pengguna Windows tampaknya. Untuk Mac, classpath pemisah :, tidak ;. Sebagai sebuah kesalahan pengaturan classpath menggunakan ; tidak dibuang maka ini dapat menjadi sulit untuk menemukan jika datang dari Windows ke Mac.

Berikut adalah sesuai Mac command:

java -classpath ".:./lib/*" com.test.MyClass

Di mana dalam contoh ini paket adalah com.tes dan lib folder ini juga akan disertakan pada classpath.

Komentar (3)