Komut satırından java .class nasıl çalıştırılır


113

Derlenmiş bir java sınıfım var:

Echo.class

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

            System.out.println(arg);
    }
}

I cddizine gidin ve şunu girin:java Echo "hello"

Bu hatayı alıyorum:

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.

Eclipse IDE kullanmak zorunda olduğu gibi, java kodumu komut satırından çalıştırabileceğim bir biçimde almanın en basit yolu nedir?


14
Öneri: Orijinal soru, cevapları geçersiz kılmamak için, hızlı bir inceleme altında düzenlenmeden bırakılsa iyi olur. Doğru yöntem imzasını görmek gerçekten tuhaf ve sonra yanlış olduğunu söyleyen bir sürü cevap. Hatalı kodun, en azından doğru versiyonla karşılaştırma amacıyla bırakılması gerekiyor.
JSmyth

Yanıtlar:


119

Deneyin:

java -cp . Echo "hello"

Aşağıdakilerle derlediğinizi varsayarsak:

javac Echo.java 

Bu durumda, "geçerli" dizinin sınıf yolunuzda olmaması ihtimali vardır (burada java .class tanımlarını arar)

Durum böyleyse ve dizininizin içeriği listeleniyorsa:

Echo.java
Echo.class

O zaman bunlardan herhangi biri işe yarayabilir:

java -cp . Echo "hello"

veya

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

Ve daha sonra Fredrik'in işaret ettiği gibi başka bir hata mesajı alacaksınız.

"Main" iş parçacığında istisna java.lang.NoSuchMethodError: main

Bu olduğunda, gidin ve cevabını okuyun :)


2
-Cp. Java'ya eklemesi gerektiğini söylemek için. (geçerli çalışma dizini) sınıf yoluna, yani kodu aradığı yer.
Fredrik

16

Sınıf yolunu belirtmeniz gerekir. Bunu yapmalı:

java -cp . Echo "hello"

Bu, java'ya .(geçerli dizini) sınıf yolu olarak, yani sınıfları aradığı yeri kullanmasını söyler . Paketleri kullandığınızda, sınıf yolunun paket alt dizinlerini değil, kök dizini içermesi gerektiğine dikkat edin. örneğin, sınıfınız my.package.Echove .class dosyası ise bin/my/package/Echo.class, doğru sınıf yolu dizini bin.


15

Geçerli bir ana yönteminiz yok ... İmza şöyle olmalıdır: public static void main ( String [] args);

Bu nedenle, sizin durumunuzda kod şu şekilde görünmelidir:

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

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

Düzenleme: Lütfen Oscar'ın eksik olduğunuzda haklı olduğunu unutmayın. sınıf yolunuzda, o hatayı hallettikten sonra çözdüğüm problemle karşılaşırsınız.


15

Java 11 ile artık bu zor durumdan geçmek zorunda kalmayacaksınız!

Bunun yerine şunu yapabilirsiniz:

> java MyApp.java

Hepsi tek adımda yapıldığı için önceden derlemenize gerek yok.

Java 11 JDK'yı buradan edinebilirsiniz: JDK 11 GA Sürümü


> C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java dosyasını kopyalayın. / y && javac Uygulamam.java && java -cp. MyApp && del MyApp.class && del MyApp.java Bazı çocuklar eski moda yolunu tercih ediyor =)
Jr.

3

Java kaynağınızda varsa

package mypackage;

ve sınıfınız hello.java ile

public class hello {

ve bu hello.java'da var

 public static void main(String[] args) {

Sonra (derlemeden sonra) changeDir (cd) 'i hello.class'ınızın bulunduğu dizine getirin. Sonra

java -cp . mypackage.hello

Sınıf adından önceki mevcut dizine ve paket adına dikkat edin. Linux'taki darphanem için çalışıyor ve umarım diğer OS'ler için de

Bol bilgi için teşekkürler Stack overflow.


1
NB: sınıf dosyası ./mypackage/hello.classad aracılığıyla bulunabilir olmalıdır . Ayrıca bkz: " Komut satırından pakette java çalıştırma " sorusu.
ruvim

2

Durumum biraz karmaşıktı. JNI kodu için kaynaklar dizininde .dll kullandığım için üç adım atmam gerekti. Dosyalarım

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

Kodum aşağıdaki satırı içeriyordu

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

Önce, sınıf yolu dizinine gitmem gerekiyordu

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

Daha sonra, sınıf yolunu geçerli dizini gösterecek şekilde değiştirmem gerekiyordu, böylece sınıfım yüklenecekti ve dll'min yüklenebilmesi için sınıf yolunu kaynaklar dizinine işaret edecek şekilde değiştirmem gerekti.

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

Sonra, sınıf adını kullanarak java'yı çalıştırmam gerekti.

java com.accessibility.HelloWorld 

0

İlk olarak, javac derleyicisini komut satırı kullanarak derlediniz mi? İkinci olarak, ana yönteminizin yanlış bir imzası var gibi görünüyor - yalnızca bir tane yerine bir dizi String nesnesi alıyor olmalı:

public static void main(String[] args){

Kodunuzu bir dizi String nesnesi alacak şekilde değiştirdikten sonra, dizinin kendisi yerine dizinin bir öğesini yazdırdığınızdan emin olmanız gerekir:

System.out.println(args[0])

Komut satırı argümanlarının tüm listesini yazdırmak istiyorsanız, bir döngü kullanmanız gerekir, örn.

for(int i = 0; i < args.length; i++){
    System.out.print(args[i]);
}
System.out.println();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.