2011-05-18 157 views
0

我想在Unix(Solaris要具體)編譯一個Java項目(的Lisp解釋器的)。我的問題是我有一些擴展其他類的類,但是當javac試圖編譯擴展類時,它說它找不到超類。javac - 超類沒有找到

命令I型:

javac -g LispObject.java 
javac -g Sexp.java 

第一個正常工作;但具有下列錯誤的第二暫停:

Sexp.java:7: Superclass interpreter.LispObject of class interpreter.Sexp not found. 
public class Sexp extends LispObject 
         ^
1 error 

(我不知道這是非常相關的,但是這是一個一流的項目,所以我必須使用makefile中編譯,所以我不能使用任何的IDE的編輯......這吮吸,因爲一切都在NetBeans中運行良好)

代碼LispObject.java

package interpreter; 

public class LispObject extends java.lang.Object 
{ 
    // empty 
} 

代碼Sexp.java

package interpreter; 

public class Sexp extends LispObject 
{ 
    // body stuff goes here 
} 

回答

1

嘗試增加-cp .javac呼叫,使得它搜索已編譯類的當前目錄。第二個電話是:

javac -cp . -g Sexp.java 

或者,給它所有的.java文件一氣呵成:

javac -g LispObject.java Sexp.java 

一般來說,最好是建立一個特定的構建目錄(我稱之爲/一些/目錄/編譯)及用途:

javac -cp /some/dir/build -d /some/dir/build your_file.java 

使得.class文件不來污染你的源文件directorie(S)。

請記住,您應該保持目錄結構與包層次結構同步。如果您的課程位於interpreter包中,則它們應放置在具有該名稱的目錄中。

所以,在此情況下,你的編譯命令應該是:

javac -cp /some/dir/build -d /some/dir/build interpreter/LispObject.java 
javac -cp /some/dir/build -d /some/dir/build interpreter/Sexp.java 
+0

一次給所有的文件似乎正在工作;你知道是否有辦法用makefile來做到這一點? – 2011-05-18 16:12:12

+0

更好的選擇是使用'-cp'指定構建的'.class'文件的位置。 (並且也使用'-d build_directory',這樣'.class'文件就不會與''混在一起。java'文件) – Mat 2011-05-18 16:13:43

+0

對不起-1,但這並沒有解決真正的問題:你不是從軟件包根目錄,而是從軟件包層次結構中構建。 – 2011-05-18 17:32:14

0

你必須編譯在一行中的所有類,如果你想認識超或添加生成的類的編譯器通過ds_student類路徑中說

0

通常包目錄的問題。

對於包編譯的類,把它們在對應於封裝結構的目錄,並從層次結構的根調用javac(或提供分層結構的根爲-sourcepath,和在-d-classpath輸出目錄)。

javac interpreter/LispObject.java 
javac interpreter/Sexp.java