Cara menjalankan java .class dari baris perintah

113

Saya memiliki kelas java yang dikompilasi:

Echo.class

public class Echo {
    public static void main (String arg) {

            System.out.println(arg);
    }
}

I cdke direktori dan masukkan:java Echo "hello"

Saya mendapatkan kesalahan ini:

C:\Documents and Settings\joe\My Documents\projects\Misc\bin>java Echo "hello"
Exception in thread "main" java.lang.NoClassDefFoundError: Echo
Caused by: java.lang.ClassNotFoundException: Echo
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: Echo.  Program will exit.

Apa cara termudah untuk mendapatkan kode java saya dalam bentuk yang dapat saya jalankan dari baris perintah sebagaimana seharusnya menggunakan Eclipse IDE?

joe
sumber
14
Saran: Pertanyaan awal, mungkin, lebih baik dibiarkan tidak diedit agar tidak membatalkan jawaban, dalam tinjauan cepat. Sangat aneh melihat tanda tangan metode yang benar dan kemudian sekelompok jawaban yang mengatakan itu salah. Kode yang salah seharusnya ditinggalkan, setidaknya untuk tujuan perbandingan dengan versi yang benar.
JSmyth

Jawaban:

119

Mencoba:

java -cp . Echo "hello"

Dengan asumsi Anda mengkompilasi dengan:

javac Echo.java 

Kemudian ada kemungkinan direktori "saat ini" tidak ada di classpath Anda (di mana java mencari definisi .class)

Jika itu masalahnya dan daftar isi direktori Anda ditampilkan:

Echo.java
Echo.class

Maka salah satu dari ini mungkin berhasil:

java -cp . Echo "hello"

atau

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

Dan nanti seperti yang ditunjukkan Fredrik, Anda akan mendapatkan pesan kesalahan lain seperti.

Pengecualian di thread "main" java.lang.NoSuchMethodError: main

Ketika itu terjadi, pergi dan baca jawabannya :)

OscarRyz
sumber
2
The -cp. untuk memberi tahu Java bahwa dia harus menambahkan. (direktori kerja saat ini) ke classpath, yang berarti tempat dia mencari kode.
Fredrik
16

Anda perlu menentukan jalur kelas. Ini harus melakukannya:

java -cp . Echo "hello"

Ini memberitahu java untuk menggunakan .(direktori saat ini) sebagai jalur kelasnya, yaitu tempat di mana ia mencari kelas. Catatan daripada saat Anda menggunakan paket, classpath harus berisi direktori root, bukan subdirektori paket. misalnya jika kelas Anda adalah my.package.Echodan file .class adalah bin/my/package/Echo.class, direktori classpath yang benar adalah bin.

Michael Borgwardt
sumber
15

Anda tidak memiliki metode utama yang valid ... Tanda tangan harus: public static void main ( String [] args);

Karenanya, dalam kasus Anda, kodenya akan terlihat seperti ini:

public class Echo {
    public static void main (String[] arg) {

            System.out.println(arg[0]);
    }
}

Sunting: Harap dicatat bahwa Oscar juga benar bahwa Anda hilang. di jalur kelas Anda, Anda akan mengalami masalah yang saya selesaikan setelah Anda menangani kesalahan itu.

Fredrik
sumber
15

Dengan Java 11 Anda tidak perlu melalui omong kosong ini lagi!

Sebagai gantinya, Anda dapat melakukan ini:

> java MyApp.java

Anda tidak perlu mengompilasi terlebih dahulu, karena semuanya dilakukan dalam satu langkah.

Anda bisa mendapatkan Java 11 JDK di sini: JDK 11 GA Release

Ryan Lundy
sumber
> salin C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java. / y && javac MyApp.java && java -cp. MyApp && del MyApp.class && del MyApp.java Beberapa pria lebih suka cara lama =)
Jr.
3

Jika ada di sumber java Anda

package mypackage;

dan kelas Anda adalah hello.java dengan

public class hello {

dan di hello.java yang Anda miliki

 public static void main(String[] args) {

Kemudian (setelah kompilasi) changeDir (cd) ke direktori tempat hello.class Anda berada. Kemudian

java -cp . mypackage.hello

Perhatikan direktori saat ini dan nama paket sebelum nama kelas. Ia bekerja untuk saya di linux mint dan saya berharap di os lain juga

Terima kasih Stack overflow untuk banyak info.

Gerard Doets
sumber
1
NB: file kelas harus dapat ditemukan melalui ./mypackage/hello.classnama. Lihat juga: pertanyaan " Menjalankan java dalam paket dari baris perintah ".
ruvim
2

Situasi saya sedikit rumit. Saya harus melakukan tiga langkah karena saya menggunakan .dll di direktori sumber daya, untuk kode JNI. File saya dulu

S:\Accessibility\tools\src\main\resources\dlls\HelloWorld.dll
S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.class

Kode saya berisi baris berikut

System.load(HelloWorld.class.getResource("/dlls/HelloWorld.dll").getPath());

Pertama, saya harus pindah ke direktori classpath

cd /D "S:\Accessibility\tools\src\test\java"

Selanjutnya, saya harus mengubah classpath untuk menunjuk ke direktori saat ini sehingga kelas saya akan dimuat dan saya harus mengubah classpath untuk menunjuk ke direktori sumber daya sehingga dll saya akan dimuat.

set classpath=%classpath%;.;..\..\..\src\main\resources; 

Kemudian, saya harus menjalankan java menggunakan nama kelas.

java com.accessibility.HelloWorld 
Scott Izu
sumber
0

Pertama, sudahkah Anda mengkompilasi kelas menggunakan baris perintah javac compiler? Kedua, tampaknya metode utama Anda memiliki tanda tangan yang salah - metode ini harus menggunakan array objek String, bukan hanya satu:

public static void main(String[] args){

Setelah Anda mengubah kode Anda untuk mengambil array objek String, maka Anda perlu memastikan bahwa Anda mencetak elemen dari array, bukan array itu sendiri:

System.out.println(args[0])

Jika Anda ingin mencetak seluruh daftar argumen baris perintah, Anda perlu menggunakan perulangan, mis

for(int i = 0; i < args.length; i++){
    System.out.print(args[i]);
}
System.out.println();
kuantitas
sumber