2012-01-16 53 views
0

瞭解以下使用-classpath的我也不是很清楚從SCJP書以下問題(我讀的答案和解釋,雖然)..不要javac的

考慮下面的目錄結構: -

foo --> test --> xcom --> A.class, B.java 

這裏foo,test和xcom是目錄。 A.class和B.java是xcom目錄中的文件。

下面是相應文件的源代碼: -

A.java

package xcom; 
public class A { } 

B.java

package xcom; 
public class B extends A { } 

默認的類路徑是/ foo。

現在,爲了編譯B.java,我把我的當前目錄爲測試並給出: -

javac -classpath xcom xcom/B.java 

在這裏,我給類路徑XCOM具有的A.class。但它仍然沒有找到A類。爲什麼這樣呢?

+1

你的當前目錄指向哪裏? – adarshr 2012-01-16 12:54:10

+0

您正在'。/ foo/test'下啓動'javac'? – aayoubi 2012-01-16 12:54:43

+0

@adarshr我的當前目錄是「foo/test」 – whitehat 2012-01-16 12:56:10

回答

0

因爲您必須指定classpath root到-classpath參數,如javac -classpath . xcom/B.java。要編譯B類java編譯器需要類A,它會嘗試在{classpathroot}/xcom/中查找A類文件。

注:. - 是當前目錄

+0

但是classpath根目錄是否在整個子目錄樹中查找類?即使我將-classpath指定爲xcom,我所需的類文件也存在於xcom中。那麼問題是什麼? – whitehat 2012-01-16 12:57:53

+2

問題是它無法解析*其他*類。如果將類路徑指定爲xcom,並且B.java需要包xcom中的A.java,它將嘗試在'xcom/xcom/A.class'(或'.java')中找到它,因爲它需要類路徑條目作爲* root *。 – 2012-01-16 13:07:23

+0

不,java沒有掃描整棵樹。如果class name = xcom/A,那麼java/javac將在/ xcom/B(相對於類路徑根)中執行搜索。如果類不能位於此路徑異常,則拋出ClassNotFoundException異常。據我瞭解,B類需要A類,並且因爲指定了不正確的類路徑,所以無法找到A類。 – 4ndrew 2012-01-16 13:08:04

2

如果你的類都在包XCOM,那麼你的類路徑必須在正上方的目錄。在這種情況下,類路徑應該是foo/test。

如果你的當前目錄是富/測試,那麼這應該是您的javac:

javac -classpath . xcom/B.java 
0

我認爲這裏的根本原因是Java中的「完全限定名」的誤解。

您的兩個類的完全限定名是xcom.A和xcom.B。它們的源代碼位於名爲xcom的目錄中的文件A.java和B.java中;完全限定名稱指定目錄結構。當你要使用這些文件時,無論是編譯它們還是運行它們,類路徑都包含一個或多個可以找到完全限定名稱的位置;所以java正在尋找xcom \ A.java和xcom \ B.java(編譯時)以及xcom \ A.class和xcom \ B.class(運行時)。

這就是爲什麼classpath需要指定包含xcom的目錄。

當你進入更復雜的環境時:類路徑可以是這樣的位置的列表;每個位置在窗口上用分號分隔,在UNIX系統上用冒號分隔。正如您已經看到的,每個位置都可以是一個目錄,但它也可以是一個jar文件。 jar文件採用zip文件格式,zip文件具有與磁盤一樣的目錄結構。所以你可以壓縮你的類文件,維護它們的xcom parent(但不是它們的完整路徑),並且在類路徑而不是目錄中指定jar文件。

我知道這個問題已經有所回答了,但是也認爲你也可能喜歡背景解釋。