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?
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 [ <option> ... ] <class-name> [<argument> ...]
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:
com.acme.contoh.ListUsers
kelas. 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.) String[]
.
Alasan mengapa pulau Jawa tidak dapat menemukan kelas 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:
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:
jawa
perintah dokumentasi jawa
perintah. Periksa bahwa nama direktori dan file JAR nama yang benar. jawa
perintah. ;
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 kelas anda FQN adalah com.acme.contoh.Foon
, maka JVM akan mencari "Foon.kelas" di direktori "com/acme/contoh":
com.acme.contoh.Foon
kelas, /usr/local/acme/classes/com/acme/example/Foon.class
, /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.
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)
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? -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. java -jar <file jar>
sintaks Alternatif sintaks yang digunakan untuk "eksekusi" file JAR adalah sebagai berikut:
java [ <option> ... ] -jar <jar-file-name> [<argument> ...]
misalnya
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
com.acme.contoh.ListUser
) dan classpath yang ditentukan dalam MANIFEST dari file JAR. 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. 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.
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
.
Apa yang membantu saya adalah menentukan classpath pada baris perintah, misalnya:
Membuat folder baru, C:\temp
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]); } }
C:\temp
, dan menulis perintah berikut untuk mengkompilasi Temp kelas:javac Temp.java
-classpath
pilihan untuk membiarkan JRE tahu di mana untuk menemukan hotel:java -classpath C:\temp Temp Hello!
Menurut pesan kesalahan ("tidak Bisa menemukan atau beban utama kelas"), ada dua kategori masalah:
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.
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.
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.
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.
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.
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
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. :)
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
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.
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)".
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.
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.