2011-10-05 43 views
0

這是跟進我的問題:困惑編譯一個基本的Java測試程序和包

error in java basic test program

這仍是困惑我。 所以具體的問題是:

我已經有一個包和目錄完成。 說com.learn.java.mypackage

$ pwd 
.../com/learn/java/mypackage 

,在這裏我要創建在同一封裝測試程序並執行它。

$cat TestPackage.java 

package com.learn.java.mypackage; 

public class TestPackage 
{ 

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

$ javac TestPackage.java 
// runs file 

$ Java TestPackage 


Exception in thread "main" java.lang.NoClassDefFoundError: TestPackage (wrong name: com/learn/java/TestPackage) 

如果Java運行時要確保屬於一個包中的文件住在同一個命名的目錄,這是真的在這裏。那麼爲什麼它仍然是嬰兒牀?

+0

你試過'java com.learn.java.mypackage.TestPackage'嗎? –

+0

我對這個問題感到困惑,特別是它與以前的不一樣。 –

+0

這裏我在那個目錄裏面,以防它有什麼區別.. – xyz

回答

1

您應該從com的父文件夾中執行java com.learn.java.mypackage.TestPackage

所以,如果com的完整路徑是/my/project/folder/com/...你應該叫java com.learn.java.mypackage.TestPackage/my/project/folder

從聊天中粘貼:

您可以從任何地方java -cp /my/project/folder a.b.c.ClassName,它告訴java查找中發現的類ClassName使用/my/project/folder

+0

這工作。謝謝。如果我想獨立於當前位置運行我的課程,該命令的外觀如何? – xyz

+0

使用java -cp/my/project /文件夾com.learn.java.mypackage.TestPackage,其中/ my/project /文件夾是com的父級 – Matyas

+0

所以這是令人困惑的。對於TestPackage,我們應該給出整個包名..它不是說類文件將自己的包信息嵌入到自身中。當我想運行類時,我只是給出類名稱,並從類路徑中獲取由包路徑前綴的類。??在這種方法中似乎有一些冗餘..一些描述/指針背後的原因應該是有用的.. – xyz

0

添加.到classpath,並使用完全限定域名(含包裝)

java命令。 com.learn.java.mypackage.TestPackage

+0

-1當前目錄是默認的類路徑,這也是錯誤的原因。 –

1

編譯可以在java文件所在的目錄中正常工作。
然而,對於運行Java程序,你需要去的目錄所在的包開始,並提供給命令

轉到目錄當中有您com文件夾的全包的信息包,然後用

java com.learn.java.mypackage.TestPackage 
+0

這有效。如何讓java運行獨立於當前路徑。並避免必須在包的開始路徑 – xyz

+0

如果您希望它獨立於路徑,則需要添加目錄(在com文件夾所在)到類路徑。類文件可以遍歷,但仍然需要完整的包路徑來執行。 – Jayendra

0

的解釋是this Java tutorial提供:包裝a.b.c和包應該在其路徑搜索:

類目錄\ classes的完整路徑稱爲類路徑,並使用CLASSPATH系統變量進行設置。編譯器和JVM都通過將包名添加到類路徑來構建.class文件的路徑。例如,如果

<path_two>\classes 

是你的類路徑和包名是

com.example.graphics, 那麼編譯器和JVM查找.class文件中

<path_two>\classes\com\example\graphics. 

類路徑可能包含多個路徑,用分號(Windows)或冒號(Unix)分隔。默認情況下,編譯器和JVM搜索當前目錄和包含Java平臺類的JAR文件,以便這些目錄自動位於類路徑中。

0

您對編譯這樣的標誌 「-d」 文件:

的javac -d。 TestPackage.java java TestPackage.java

試試!