2012-05-08 151 views
8

我在編譯和從命令行運行Eclipse java項目時遇到了兩個問題。當我剛剛從eclipse IDE運行時,這工作正常。我嘗試了谷歌搜索,但無法真正的工作。任何幫助深表感謝。從命令行運行Eclipse項目

問題1:當我嘗試從與.java文件不同的位置進行編譯時,它會引發錯誤「無法讀取:myfile.java」。但如果我遷移到這個目錄然後編譯。
我正在給該命令(當在某些其他目錄):
的javac -cp C:\ ABC \ SRC \ XYZ myfile.java
我正在給在XYZ目錄時,命令:
的javac myfile.java
這生成了兩個.class文件myfile.class和Testing_Thread.class(我想這是因爲我在我的代碼中的線程)

問題2:我已經將它的目錄之後編譯,當我嘗試運行程序時,出現錯誤「線程異常」主「java.lang.NoClassDefFoundError:myfile(錯誤名稱:XYZ/myfile.java)」即使我試圖從XYZ目錄運行。我也嘗試從其他地方跑時遇到同樣的錯誤。
,我是給在XYZ目錄時,命令:
的Java MYFILE
是我給的時候在其他一些地方的命令:
java命令C:\ ABC \ SRC \ XYZ MYFILE

我還附上我的目錄結構的層次結構,如果它是任何幫助:
enter image description here

回答

8

這些示例假設以下源結構:

C:\temp\compile-test\src\a\b\c\D.java 

其中D.java是:

package a.b.c; 

public class D { } 

第一個問題,無法讀取:myfile.java,是因爲它是不正確的使用cp命令行選項來點到你的源代碼。

C:\temp\compile-test\src>javac -cp c:\temp\compile-test\src\a\b\c D.java 
javac: file not found: D.java 
Usage: javac <options> <source files> 
use -help for a list of possible options 

這應該改爲以下,其中javac從源文件夾中運行,我們可以使用相對路徑的源文件(注 - javac從源文件夾運行此處):

C:\temp\compile-test\src>javac a\b\c\D.java 

還是這個,在這裏我們指明完整路徑的源文件,並javac可以在任何地方運行(注 - javacC:\運行這裏):

C:\>javac temp\compile-test\src\a\b\c\D.java 

以上兩個選項都會導致您的類文件與源文件在同一個文件夾中創建。即:

C:\temp\compile-test\src\a\b\c\D.class 

對於第二個問題,如果你試着運行具有從「內部」包一包名稱的類,這將導致名稱被錯誤(注 - java正在從「內部」運行這裏的包):

C:\temp\compile-test\src\a\b\c>java D 
Exception in thread "main" java.lang.NoClassDefFoundError: D (wrong name: a/b/c/D) 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 
     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:306) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
Could not find the main class: D. Program will exit. 

要運行D類,你應該在包裝「根」,並提供Fully Qualified Class Name。即:

C:\temp\compile-test\src>java a.b.c.D 
Exception in thread "main" java.lang.NoSuchMethodError: main 

注意我得到一個異常的D類沒有一個主要方法,因此不能運行。要解決,我們添加了一個主要方法:

package a.b.c; 

public class D { 
    public static void main(String[] args) { 
     System.out.println("main"); 
    } 
} 

,並重新運行:

C:\temp\compile-test\src>java a.b.c.D 
main 
+0

感謝您的奇妙明確的解釋:) – sachin11