2009-08-14 57 views
70

我有一個編譯的Java類:如何在命令行中執行的Java .class

Echo.class

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

      System.out.println(arg); 
    } 
} 

cd的目錄,然後輸入:java Echo "hello"

我得到這個錯誤:

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. 

以可以從命令行運行的形式獲取我的java代碼的最簡單方法是什麼?因爲必須使用Eclipse IDE?

+11

建議:最好的問題或許最好留在未經編輯的位置,以便在快速回顧下不會使答案無效。真的很奇怪看到正確的方法簽名,然後一堆答案說它是不正確的。至少,爲了與正確的版本進行比較,應該留下錯誤的代碼。 – JSmyth 2014-02-03 09:34:18

回答

83

嘗試:

java -cp . Echo "hello" 

假設你編譯:

javac Echo.java 

然後有一個機會, 「當前」 目錄是不是在你的類路徑中(其中java查找.class定義)

如果是這種情況,並列出您的目錄顯示內容:

Echo.java 
Echo.class 

那麼任何的可能的工作:

java -cp . Echo "hello" 

SET CLASSPATH=%CLASSPATH;. 

java Echo "hello" 

後來由於Fredrik指出,你會得到像其他錯誤消息。

Exception in thread "main" java.lang.NoSuchMethodError: main

發生這種情況時,去閱讀他的答案:)

+0

+1 as承諾.. – Fredrik 2009-08-14 19:04:44

+0

這似乎工作,但爲什麼:java -cp。 – joe 2009-08-14 19:13:59

+2

-cp。告訴Java他應該添加。 (當前工作目錄)到類路徑,這意味着他正在尋找代碼的地方。 – Fredrik 2009-08-14 19:24:39

11

您需要指定類路徑。這應做到:

java -cp . Echo "hello" 

這本講述java使用.(當前目錄)作爲它的類路徑,即地方查找類的地方。請注意,比使用包時,類路徑必須包含根目錄,而不是包子目錄。例如如果您的班級爲my.package.Echo且.class文件爲bin/my/package/Echo.class,則正確的類路徑目錄爲bin

11

您沒有有效的主要方法...簽名應該是: public static void main(String [] args);

因此,在你的情況下,代碼應該是這樣的:

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

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

編輯:請注意,Oscar也是正確的,你缺失。在你的類路徑中,在處理完這個錯誤之後,你會遇到我解決的問題。

+0

+1閱讀代碼 – Allyn 2009-08-14 18:58:06

+0

@Allyn:我會-1沒有閱讀異常,雖然::) :) :)但我們是朋友在這裏不要'我們呢? – OscarRyz 2009-08-14 19:00:36

+0

@Oscar:我給你的學分,是不是:-)(實際上,我也會給你+1) – Fredrik 2009-08-14 19:02:23

0

首先,你使用命令行javac編譯器編譯了類嗎?其次,它似乎是你的主要方法有一個不正確的簽名 - 這應該採取在一個String對象的數組,而不是隻有一個:

public static void main(String[] args){ 

一旦你改變了你的代碼,以在String數組對象,那麼你需要確保你打印數組的元素,而不是數組本身:

System.out.println(args[0]) 

如果你想打印的命令行參數的整個列表,你需要使用一個循環,例如

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

我的情況有點複雜。自從我在資源目錄中使用.dll以來,我必須執行三個步驟來獲取JNI代碼。我的文件是

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

我的代碼包含以下行

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

首先,我不得不搬到類路徑目錄

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

接下來,我不得不改變類路徑指向到當前目錄,以便我的類將被加載,我不得不改變類路徑指向他的資源目錄,所以我的DLL將被加載。然後,我不得不使用classname運行java。

java com.accessibility.HelloWorld