Masalah umum yang dialami pengembang Java baru adalah bahwa program mereka gagal dijalankan dengan pesan kesalahan: Could not find or load main class ...
Apa artinya ini, apa yang menyebabkannya, dan bagaimana Anda harus memperbaikinya?
Masalah umum yang dialami pengembang Java baru adalah bahwa program mereka gagal dijalankan dengan pesan kesalahan: Could not find or load main class ...
Apa artinya ini, apa yang menyebabkannya, dan bagaimana Anda harus memperbaikinya?
Jawaban:
java <class-name>
sintaks perintahPertama-tama, Anda perlu memahami cara yang benar untuk meluncurkan program menggunakan perintah java
(atau javaw
).
Sintaks 1 yang normal adalah ini:
java [ <options> ] <class-name> [<arg> ...]
di mana <option>
ada opsi baris perintah (dimulai dengan karakter "-"), <class-name>
adalah nama kelas Java yang sepenuhnya memenuhi syarat, dan <arg>
merupakan argumen baris perintah sewenang-wenang yang diteruskan ke aplikasi Anda.
1 - Ada beberapa sintaks lain yang dijelaskan pada akhir jawaban ini.
Nama yang sepenuhnya memenuhi syarat (FQN) untuk kelas ditulis secara konvensional seperti yang Anda lakukan pada kode sumber Java; misalnya
packagename.packagename2.packagename3.ClassName
Namun beberapa versi java
perintah memungkinkan Anda untuk menggunakan garis miring alih-alih titik; misalnya
packagename/packagename2/packagename3/ClassName
yang (membingungkan) terlihat seperti pathname file, tetapi bukan salah satunya. Perhatikan bahwa istilah nama yang sepenuhnya memenuhi syarat adalah istilah Java standar ... bukan sesuatu yang saya buat untuk membingungkan Anda :-)
Ini adalah contoh dari bagaimana sebuah java
perintah seharusnya terlihat:
java -Xmx100m com.acme.example.ListUsers fred joe bert
Di atas akan menyebabkan java
perintah untuk melakukan hal berikut:
com.acme.example.ListUsers
kelas.main
metode dengan tanda tangan , jenis kembali dan pengubah yang diberikan oleh public static void main(String[])
. (Catatan, nama argumen metode BUKAN bagian dari tanda tangan.)String[]
.Ketika Anda menerima pesan "Tidak dapat menemukan atau memuat kelas utama ...", itu berarti bahwa langkah pertama telah gagal. The java
perintah tidak dapat menemukan kelas. Dan memang, "..." dalam pesan akan menjadi nama kelas berkualifikasi penuh yang java
dicari.
Jadi mengapa mungkin tidak dapat menemukan kelas?
Kemungkinan penyebab pertama adalah bahwa Anda mungkin memberikan nama kelas yang salah. (Atau ... nama kelas yang tepat, tetapi dalam bentuk yang salah.) Mengingat contoh di atas, berikut adalah berbagai cara yang salah untuk menentukan nama kelas:
Contoh # 1 - nama kelas sederhana:
java ListUser
Ketika kelas dideklarasikan dalam paket seperti com.acme.example
, maka Anda harus menggunakan nama kelas lengkap termasuk nama paket dalam java
perintah; misalnya
java com.acme.example.ListUser
Contoh # 2 - nama file atau nama path alih-alih nama kelas:
java ListUser.class
java com/acme/example/ListUser.class
Contoh # 3 - nama kelas dengan selubung yang salah:
java com.acme.example.listuser
Contoh # 4 - salah ketik
java com.acme.example.mistuser
Contoh # 5 - nama file sumber (kecuali Java 11 atau lebih baru; lihat di bawah)
java ListUser.java
Contoh # 6 - Anda lupa nama kelas sepenuhnya
java lots of arguments
Kemungkinan penyebab kedua adalah bahwa nama kelas sudah benar, tetapi bahwa java
perintah tidak dapat menemukan kelas. Untuk memahami ini, Anda perlu memahami konsep "classpath". Ini dijelaskan dengan baik oleh dokumentasi Oracle:
java
dokumentasi perintahJadi ... jika Anda telah menentukan nama kelas dengan benar, hal berikutnya yang perlu diperiksa adalah Anda telah menentukan kelas dengan benar:
java
perintah. Periksa apakah nama direktori dan nama file JAR sudah benar.java
perintah.;
pada Windows dan :
yang lainnya. Jika Anda menggunakan pemisah yang salah untuk platform Anda, Anda tidak akan mendapatkan pesan kesalahan yang eksplisit. Sebaliknya, Anda akan mendapatkan file atau direktori yang tidak ada di jalur yang akan diabaikan secara diam-diam .)Ketika Anda meletakkan direktori di classpath, secara tidak langsung sesuai dengan akar ruang nama yang memenuhi syarat. Kelas-kelas terletak di struktur direktori di bawah root itu, dengan memetakan nama yang sepenuhnya memenuhi syarat untuk pathname . Jadi misalnya, jika "/ usr / local / acme / classes" ada di jalur kelas, maka ketika JVM mencari kelas yang dipanggil com.acme.example.Foon
, itu akan mencari file ".class" dengan pathname ini:
/usr/local/acme/classes/com/acme/example/Foon.class
Jika Anda telah meletakkan "/ usr / local / acme / classes / com / acme / example" di classpath, maka JVM tidak akan dapat menemukan kelas.
Jika kelas Anda FQN com.acme.example.Foon
, maka JVM akan mencari "Foon.class" di direktori "com / acme / example":
Jika struktur direktori Anda tidak cocok dengan penamaan paket sesuai pola di atas, JVM tidak akan menemukan kelas Anda.
Jika Anda mencoba mengubah nama kelas dengan memindahkannya, itu akan gagal juga ... tetapi stacktrace pengecualian akan berbeda. Dimaksudkan untuk mengatakan sesuatu seperti ini:
Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
karena FQN dalam file kelas tidak cocok dengan apa yang diharapkan oleh loader kelas.
Untuk memberikan contoh nyata, seandainya:
com.acme.example.Foon
kelas,/usr/local/acme/classes/com/acme/example/Foon.class
,/usr/local/acme/classes/com/acme/example/
,kemudian:
# 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:
-classpath
pilihan dapat disingkat menjadi -cp
di sebagian besar rilis Java. Periksa entri manual masing-masing untuk java
, javac
dan seterusnya.Kebutuhan classpath untuk memasukkan semua lainnya (non-sistem) kelas bahwa aplikasi Anda tergantung pada. (Kelas-kelas sistem terletak secara otomatis, dan Anda jarang perlu mengkhawatirkan diri Anda dengan ini.) Untuk kelas utama memuat dengan benar, JVM perlu menemukan:
(Catatan: spesifikasi JLS dan JVM memungkinkan beberapa ruang lingkup untuk JVM memuat kelas "malas", dan ini dapat memengaruhi ketika pengecualian classloader dilempar.)
Kadang-kadang terjadi bahwa seseorang meletakkan file kode sumber ke folder yang salah di pohon kode sumber mereka, atau mereka meninggalkan package
deklarasi. Jika Anda melakukan ini dalam IDE, kompiler IDE akan segera memberi tahu Anda tentang hal ini. Demikian pula jika Anda menggunakan alat Java build yang layak, alat tersebut akan berjalan javac
dengan cara yang akan mendeteksi masalah. Namun, jika Anda membuat kode Java dengan tangan, Anda dapat melakukannya sedemikian rupa sehingga kompiler tidak melihat masalah, dan file ".class" yang dihasilkan tidak berada di tempat yang Anda harapkan.
Ada banyak hal untuk diperiksa, dan mudah untuk melewatkan sesuatu. Coba tambahkan -Xdiag
opsi ke java
baris perintah (sebagai yang pertama setelah java
). Ini akan menampilkan berbagai hal tentang pemuatan kelas, dan ini mungkin memberi Anda petunjuk tentang apa masalah sebenarnya.
Juga, pertimbangkan kemungkinan masalah yang disebabkan oleh menyalin dan menempelkan karakter yang tidak terlihat atau non-ASCII dari situs web, dokumen, dan sebagainya. Dan perhatikan "homoglyphs", apakah dua huruf atau simbol terlihat sama ... tetapi tidak.
Akhirnya, Anda tampaknya dapat mengalami masalah ini jika Anda mencoba meluncurkan dari file JAR dengan tanda tangan yang salah di (META-INF/*.SF)
.
java
Ada tiga sintaks alternatif untuk meluncurkan program Java menggunakan java command
.
1) Sintaks yang digunakan untuk meluncurkan file JAR "yang dapat dieksekusi" adalah sebagai berikut:
java [ <options> ] -jar <jar-file-name> [<arg> ...]
misalnya
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
Nama kelas entry-point (yaitu com.acme.example.ListUser
) dan classpath ditentukan dalam MANIFEST file JAR.
2) Sintaks untuk meluncurkan aplikasi dari modul (Java 9 dan yang lebih baru) adalah sebagai berikut:
java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
Nama kelas entrypoint didefinisikan dengan <module>
sendirinya, atau diberikan oleh opsional <mainclass>
.
3) Dari Java 11 dan seterusnya, Anda dapat mengkompilasi dan menjalankan file kode sumber tunggal dan menjalankannya dengan sintaks berikut:
java [ <options> ] <sourcefile> [<arg> ...]
di mana (biasanya) file dengan akhiran ".java".
Untuk detail lebih lanjut, silakan merujuk ke dokumentasi resmi untuk java
perintah untuk rilis Java yang Anda gunakan.
IDE Java biasanya memiliki dukungan untuk menjalankan aplikasi Java di IDE JVM itu sendiri atau di JVM anak. Ini umumnya kebal dari pengecualian khusus ini, karena IDE menggunakan mekanisme sendiri untuk membangun classpath runtime, mengidentifikasi kelas utama dan membuat java
baris perintah.
Namun masih dimungkinkan untuk pengecualian ini terjadi, jika Anda melakukan hal-hal di belakang IDE. Misalnya, jika sebelumnya Anda telah mengatur Peluncur Aplikasi untuk aplikasi Java Anda di Eclipse, dan Anda kemudian memindahkan file JAR yang berisi kelas "utama" ke tempat yang berbeda di sistem file tanpa memberi tahu Eclipse , Eclipse tanpa disadari akan meluncurkan JVM dengan classpath yang salah.
Singkatnya, jika Anda mendapatkan masalah ini dalam IDE, periksa hal-hal seperti keadaan IDE basi, referensi proyek yang rusak atau konfigurasi peluncur yang rusak.
Dimungkinkan juga bagi suatu IDE untuk bingung. IDE adalah perangkat lunak yang sangat rumit yang terdiri dari banyak bagian yang saling berinteraksi. Banyak dari bagian ini mengadopsi berbagai strategi caching untuk membuat IDE secara keseluruhan responsif. Ini kadang-kadang bisa salah, dan satu gejala yang mungkin adalah masalah saat meluncurkan aplikasi. Jika Anda menduga ini bisa terjadi, ada baiknya mencoba hal-hal lain seperti memulai ulang IDE Anda, membangun kembali proyek dan sebagainya.
java -cp ../third-party-library.jar com.my.package.MyClass
:; ini tidak berfungsi, sebagai gantinya perlu menambahkan folder lokal ke jalur kelas juga (dipisahkan oleh :
, seperti ini java -cp ../third-party-library.jar:. com.my.package.MyClass
java
tidak mengatakan itu tidak menemukan kelas yang diimpor, tetapi kelas utama yang Anda coba jalankan. Ini menyesatkan, meskipun saya yakin ada alasan untuk itu. Saya memiliki kasus di mana java
tahu persis di mana kelas saya, tetapi tidak dapat menemukan salah satu kelas yang diimpor. Alih-alih mengatakan itu, ia mengeluh tidak menemukan kelas utama saya. Sungguh, mengumumkan.
Jika nama kode sumber Anda adalah HelloWorld.java, kode kompilasi Anda adalah HelloWorld.class
.
Anda akan mendapatkan kesalahan itu jika Anda menyebutnya menggunakan:
java HelloWorld.class
Sebaliknya, gunakan ini:
java HelloWorld
javac TestCode.java
diikuti olehjava TestCode
java -classpath . HelloWorld
Jika kelas Anda dalam paket maka Anda harus ke cd
direktori root proyek Anda dan menjalankan menggunakan nama kelas yang memenuhi syarat (packageName.MainClassName).
Contoh:
Kelas saya ada di sini:
D:\project\com\cse\
Nama yang sepenuhnya memenuhi syarat dari kelas utama saya adalah:
com.cse.Main
Jadi saya cd
kembali ke direktori proyek root:
D:\project
Kemudian berikan java
perintah:
java com.cse.Main
Jawaban ini adalah untuk menyelamatkan programmer java pemula dari frustrasi yang disebabkan oleh kesalahan umum, saya sarankan Anda membaca jawaban yang diterima untuk lebih banyak pengetahuan mendalam tentang classpath java.
Jika Anda mendefinisikan kelas utama dan metode utama dalam apackage
, Anda harus menjalankannya di direktori hierarkis, menggunakan nama lengkap kelas ( packageName.MainClassName
).
Asumsikan ada 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 direktori paket seperti ./com/test/Main.Java
. Dan dalam penggunaan direktori root java com.test.Main
.
Ketika kode yang sama berfungsi pada satu PC, tetapi menunjukkan kesalahan pada yang lain, solusi terbaik yang pernah saya temukan adalah mengkompilasi seperti berikut:
javac HelloWorld.java
java -cp . HelloWorld
javac -classpath . HelloWorld.java
akan berhasil! Dan itu adalah solusi yang lebih baik dalam kasus Anda.
Yang membantu saya adalah menentukan classpath pada baris perintah, misalnya:
Buat folder baru, C:\temp
Buat file Temp.java di C:\temp
, dengan kelas berikut di dalamnya:
public class Temp {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
Buka baris perintah di folder C:\temp
, dan tulis perintah berikut untuk mengkompilasi kelas Temp:
javac Temp.java
Jalankan kelas Java terkompilasi, tambahkan -classpath
opsi untuk memberi tahu JRE di mana menemukan kelas:
java -classpath C:\temp Temp Hello!
java
tidak melihat $ CLASSPATH (karena Anda menggunakan -classpath atau -jar) atau 2) pengaturan classpath tidak disetel di lingkungan yang tidak berpengaruh dalam konteks yang java
sebelumnya Lari; misalnya karena Anda tidak "sumber" file di mana menambahkan perintah setenv di shell kanan.
Menurut pesan kesalahan ("Tidak dapat menemukan atau memuat kelas utama"), ada dua kategori masalah:
Kelas utama tidak dapat ditemukan ketika ada kesalahan ketik atau sintaks yang salah dalam nama kelas yang memenuhi syarat atau tidak ada dalam classpath yang disediakan .
Kelas utama tidak dapat dimuat ketika kelas tidak dapat dimulai , biasanya kelas utama memperluas kelas lain dan kelas itu tidak ada di classpath yang disediakan.
Sebagai contoh:
public class YourMain extends org.apache.camel.spring.Main
Jika pegas unta tidak termasuk, kesalahan ini akan dilaporkan.
extends
). Saya baru saja belajar dengan cara yang sulit bahwa ketika kelas utama gagal memuat karena memperluas yang lain yang tidak dapat ditemukan , java tidak melaporkan kelas mana yang sebenarnya tidak ditemukan (tidak seperti NoClassDefFoundError
). Jadi ya itu memang terjadi, dan ini adalah situasi yang menarik ketika Anda tidak tahu ini.
Saya memiliki kesalahan dalam hal ini:
java -cp lib.jar com.mypackage.Main
Ini berfungsi dengan ;
untuk Windows dan :
untuk Unix:
java -cp lib.jar; com.mypackage.Main
Main
tidak ada dalam file JAR. -cp lib.jar;
berarti hal yang sama -cp lib.jar;.
dengan direktori saat ini disertakan pada classpath.
Coba -diag .
Jawaban Steve C mencakup semua kemungkinan kasus dengan baik, tetapi kadang-kadang untuk menentukan apakah kelas tidak dapat ditemukan atau dimuat mungkin tidak semudah itu. Gunakan java -Xdiag
(sejak JDK 7). Ini mencetak stacktrace bagus yang memberikan petunjuk tentang apa arti pesan Could not find or load main class
pesan.
Misalnya, ini dapat mengarahkan Anda ke kelas lain yang digunakan oleh kelas utama yang tidak dapat ditemukan dan mencegah kelas utama untuk dimuat.
Gunakan perintah ini:
java -cp . [PACKAGE.]CLASSNAME
Contoh: Jika nama kelas Anda adalah Hello.class dibuat dari Hello.java kemudian gunakan perintah di bawah ini:
java -cp . Hello
Jika file Anda Hello.java ada di dalam paket com.demo maka gunakan perintah di bawah ini
java -cp . com.demo.Hello
Dengan JDK 8 berkali-kali terjadi bahwa file kelas hadir di folder yang sama, tetapi java
perintah mengharapkan classpath dan untuk alasan ini kami menambahkan -cp .
untuk mengambil folder saat ini sebagai referensi untuk classpath.
-cp .
tidak perlu, karena jika $CLASSPATH
tidak disetel, maka .
adalah classpath default.
echo %CLASSPATH%
keluaran?) Dan tidak, saya tidak dapat memeriksa karena saya tidak memiliki PC Windows.
Kadang-kadang apa yang menyebabkan masalah tidak ada hubungannya dengan kelas utama, dan saya harus menemukan ini dengan cara yang sulit. Itu adalah pustaka referensi yang saya pindah, dan memberi saya:
Tidak dapat menemukan atau memuat xxx kelas utama Linux
Saya baru saja menghapus referensi itu, menambahkannya lagi, dan itu berfungsi dengan baik lagi.
Dalam hal ini Anda memiliki:
Tidak dapat menemukan atau memuat kelas utama ?
Itu karena Anda menggunakan "-classpath", tetapi tanda hubung tidak sama dengan tanda hubung yang digunakan java
pada command prompt. Saya mengalami masalah menyalin dan menempel dari Notepad ke cmd.
Saya memiliki masalah yang sama dan akhirnya menemukan kesalahan saya :) Saya menggunakan perintah ini untuk kompilasi dan 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
Tetapi perintah ini tidak berfungsi untuk saya (saya tidak dapat menemukan atau memuat 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 baru saja menambahkan karakter ':' di akhir classpath dan masalahnya selesai:
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 membantu Anda jika kasus Anda secara khusus seperti milik saya: sebagai pemula saya juga mengalami masalah ini ketika saya mencoba menjalankan program Java.
Saya mengkompilasinya seperti ini:
javac HelloWorld.java
Dan saya mencoba menjalankan juga dengan ekstensi yang sama:
java Helloworld.java
Ketika saya menghapus .java
dan menulis ulang perintah seperti java HelloWorld
, program berjalan dengan sempurna. :)
Sepertinya semua jawaban di sini ditujukan untuk pengguna Windows. Untuk Mac, pemisah classpath adalah :
, tidak ;
. Sebagai pengaturan kesalahan classpath menggunakan ;
tidak dibuang maka ini bisa sulit ditemukan jika datang dari Windows ke Mac.
Ini adalah perintah Mac yang sesuai:
java -classpath ".:./lib/*" com.test.MyClass
Di mana dalam contoh ini paketnya com.test
dan sebuah lib
folder juga akan dimasukkan pada classpath.
/*
perlu?
Lokasi file kelas: C: \ test \ com \ company
Nama File: Main.class
Nama kelas yang sepenuhnya memenuhi syarat: com.company.Main
Perintah baris perintah:
java -classpath "C:\test" com.company.Main
Perhatikan di sini bahwa jalur kelas TIDAK termasuk \ com \ company
Saya menghabiskan banyak waktu untuk menyelesaikan masalah ini. Saya pikir saya entah bagaimana cara mengatur classpath saya salah tetapi masalahnya adalah saya mengetik:
java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool
dari pada:
java -cp C:/java/MyClasses utilities/myapp/Cool
Saya pikir arti sepenuhnya memenuhi syarat berarti untuk memasukkan nama path lengkap, bukan nama paket lengkap.
utilities.myapp.Cool
atau apa pun nama paketnya, jika ada.
Pertama-tama setel path menggunakan perintah ini;
set path="paste the set path address"
Maka Anda perlu memuat program. Ketik "cd (nama folder)" di drive yang disimpan dan kompilasi. Sebagai Contoh, jika program saya disimpan di drive D, ketik "D:" tekan enter dan ketik "cd (nama folder)".
if "cd" helps then it by luck rather than by judgement
. Ini salah (saya percaya), karena java menggunakan direktori saat ini .
sebagai bagian dari classpath secara default.
Apa yang memperbaiki masalah dalam kasus saya adalah:
Klik kanan pada proyek / kelas yang ingin Anda jalankan, lalu Run As
-> Run Configurations
. Maka Anda harus memperbaiki konfigurasi yang ada atau menambahkan yang baru dengan cara berikut:
buka Classpath
tab, klik Advanced...
tombol lalu tambahkan bin
folder proyek Anda.
Jika Anda menggunakan Maven untuk membangun file JAR, pastikan untuk menentukan kelas utama dalam file pom.xml:
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>class name us.com.test.abc.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Ini adalah kasus khusus, tetapi karena saya datang ke halaman ini untuk mencari solusi dan tidak menemukannya, saya akan menambahkannya di sini.
Windows (diuji dengan 7) tidak menerima karakter khusus (seperti á
) di kelas dan nama paket. Linux melakukannya.
Saya menemukan ini ketika saya membangun .jar
di NetBeans dan mencoba menjalankannya di command line. Itu berjalan di NetBeans tetapi tidak di baris perintah.
Di Windows, masukkan .;
nilai CLASSPATH di awal.
. (titik) berarti "lihat di direktori saat ini". Ini solusi permanen.
Anda juga dapat mengaturnya "satu kali" dengan set CLASSPATH=%CLASSPATH%;.
. Ini akan berlangsung selama jendela cmd Anda terbuka.
Anda benar-benar perlu melakukan ini dari src
folder. Di sana Anda mengetikkan baris perintah berikut:
[name of the package].[Class Name] [arguments]
Katakanlah kelas Anda dipanggil CommandLine.class
, dan kodenya terlihat seperti ini:
package com.tutorialspoint.java;
/**
* Created by mda21185 on 15-6-2016.
*/
public class CommandLine {
public static void main(String args[]){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
Maka Anda harus cd
ke folder src dan perintah yang perlu Anda jalankan akan terlihat seperti ini:
java com.tutorialspoint.java.CommandLine this is a command line 200 -100
Dan output pada baris perintah adalah:
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
cd
masuk src
dan kemudian menjalankan perintah java ../bin com.blah.blah.MyClass
yang bekerja untuk saya. Jadi terima kasih atas tipnya!
Di Jawa, ketika Anda kadang-kadang menjalankan JVM dari baris perintah menggunakan executable java dan mencoba untuk memulai program dari file kelas dengan public static void main (PSVM), Anda mungkin mengalami kesalahan di bawah ini meskipun parameter classpath ke JVM akurat dan file kelas ada di classpath:
Error: main class not found or loaded
Ini terjadi jika file kelas dengan PSVM tidak dapat dimuat. Salah satu alasan yang mungkin untuk itu adalah bahwa kelas dapat mengimplementasikan antarmuka atau memperluas kelas lain yang tidak ada di classpath. Biasanya jika kelas tidak ada di classpath, kesalahan yang dilemparkan menunjukkan seperti itu. Tetapi, jika kelas yang digunakan diperluas atau diimplementasikan, java tidak dapat memuat kelas itu sendiri.
Referensi: https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/
Ketika menjalankan java
dengan -cp
pilihan seperti yang diiklankan di Windows PowerShell Anda mungkin mendapatkan error yang terlihat sesuatu seperti:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
Agar PowerShell menerima perintah, argumen -cp
opsi harus terkandung dalam tanda kutip seperti pada:
java -cp 'someDependency.jar;.' ClassName
Membentuk perintah dengan cara ini harus memungkinkan Java memproses argumen classpath dengan benar.
Saya juga menghadapi kesalahan serupa saat menguji koneksi Java MongoDB JDBC. Saya pikir itu baik untuk merangkum solusi terakhir saya secara singkat sehingga di masa depan siapa pun dapat langsung melihat ke dua perintah dan baik untuk melanjutkan lebih jauh.
Asumsikan Anda berada di direktori di mana file Java dan dependensi eksternal Anda (file JAR) ada.
Menyusun:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
Lari:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
JavaMongoDBConnection
tidak memiliki paket, dan 2) Anda tidak mengubah direktori. Singkatnya, ini rapuh. Dan dengan tidak menjelaskan masalah, itu akan mengarahkan pemula untuk mencoba pendekatan ini dalam situasi di mana itu tidak akan berhasil . Singkatnya, ini mendorong "teknik pemrograman voodoo": en.wikipedia.org/wiki/Voodoo_programming
Baiklah, sudah ada banyak jawaban, tetapi tidak ada yang menyebutkan kasus di mana izin file dapat menjadi biang keladinya.
Saat berjalan, pengguna mungkin tidak memiliki akses ke file JAR atau salah satu direktori path. Sebagai contoh, pertimbangkan:
File jar /dir1/dir2/dir3/myjar.jar
User1 yang memiliki file JAR dapat melakukan:
# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar
Tapi itu masih tidak berhasil:
# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram
Ini karena pengguna yang berjalan (User2) tidak memiliki akses ke dir1, dir2, atau javalibs atau dir3. Ini dapat membuat orang gila ketika User1 dapat melihat file, dan dapat mengaksesnya, tetapi kesalahan masih terjadi untuk User2.
Saya mendapatkan kesalahan ini setelah melakukan mvn eclipse:eclipse
ini.classpath
file sedikit.
Harus mengubah garis masuk .classpath
dari
<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
untuk
<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**" output="target/classes" />
Saya tidak dapat menyelesaikan masalah ini dengan solusi yang dinyatakan di sini (meskipun jawabannya menyatakan, sudah pasti, membersihkan konsep saya). Saya menghadapi masalah ini dua kali dan setiap kali saya mencoba solusi yang berbeda (dalam Eclipse IDE).
main
metode di berbagai kelas proyek saya. Jadi, saya telah menghapus main
metode dari kelas-kelas berikutnya.main
metode tidak akan memperbaiki masalah. Tidak ada yang salah secara teknis dengan aplikasi yang memiliki banyak titik masuk.