2011-09-29 34 views
1
$cat JarTest.java 

package edu.testjava.simple; 

public class JarTest 
{ 
    public static void main(String args[]) 
    { 
     System.out.println("Hello World\n"); 
    } 
} 


$javac JarTest.java 

$java JarTest 

我得到錯誤:錯誤在Java基礎的測試程序

Exception in thread "main" java.lang.NoClassDefFoundError: JarTest (wrong name: edu/testjava/simple/JarTest) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
Could not find the main class: JarTest. Program will exit. 

爲什麼會這樣?

包等有什麼問題嗎?

謝謝!

+0

啓動它你做的是完全直觀的,這是非常煩人的,這不只是工作。爲了擴展Matt的答案,您需要指定classpath包含當前目錄。我認爲這是因爲java正在查找文件目錄./edu/testjava/simple。 –

回答

3

是的,這是因爲包裝。 Java強制項目結構與包結構相同。這意味着,edu.testjava.simple包中的類必須位於edu/testjava/simple/目錄中。

您可以:

  • 刪除包聲明(然而,這僅僅是在這樣的「Hello World」的情況下接受)
  • 編譯使用javac -d . JarTest.java文件(這將會把.class文件中相應的目錄),並通過java edu.testjava.simple.JarTest
+0

是的,這就是爲什麼我說「要麼」。如果您選擇第一個選項,則可以按照作者的建議編譯和執行源文件。 –

+0

你說得對,刪除了評論,對不起。 –

+0

編譯後使用-d,它會創建適當的匹配目錄,我可以通過手動在該目錄中啓動它,然後只是說java JarTest? – xyz

4

你需要做的:

$ java -cp . edu.testjava.simple.JarTest 

你需要指定使用完整包名的類名(在這種情況下edu.testjava.simple)。最後你不需要.class或.java。

您也可以看到How to execute a java .class from the command line的答案。

+0

爲了這個工作,我應該如何用javac編譯? – xyz

+0

javac -d。 edu/testjava/simple/JarTest.java,用適當的/或\表示你的系統 –