2012-12-01 76 views
5

我是Java的新手,我已經瀏覽了網絡尋找解決方案,但似乎沒有任何工作。請幫幫我。導入自定義Java類

我有兩個文件。其中之一是包含主函數的java文件。在它:

... 
VaporVisitor visitor = new VaporVisitor(); 
... 

與該命令,我想創建一個新的對象VaporVisitor,這是所謂的VaporVisitor.java一個單獨的文件中的類。但是Java不能識別VaporVisitor是什麼,大概是因爲它不知道VaporVisitor.java存在(它在同一個目錄中)。我嘗試讓它們成爲同一個軟件包的一部分,使用不同的軟件包並導入......並且所有這些都失敗了。任何人都可以給我任何指導嗎?

謝謝!

編輯:這正是我在做什麼,並得到的錯誤消息: 所以我有3個文件。 V2VM(帶有我的主要功能),VaporVisitor和一個提供了幾個自定義類的jar文件。 jar文件不給我任何問題;它試圖讓java識別VaporVisitor。

所以在V2VM(主要功能)中,我試過放入:import V2VM.java;,這是行不通的。我已經嘗試將V2VM放在名爲vv的子文件夾中,並將其添加到VaporVisitor的package vv;,並將其放入V2VM.java import vv.*,但那也不起作用。

對於編譯,我試過javac -classpath [the jar file].jar V2VM.java

的錯誤,它給了我:

V2VM.java:15: cannot find symbol 
symbol : class VaporVisitor 
location: class V2VM 
VaporVisitor visitor = new VaporVisitor(); 
^ 
V2VM.java:15: cannot find symbol 
symbol : class VaporVisitor 
location: class V2VM 
VaporVisitor visitor = new VaporVisitor(); 
         ^

當我運行javacc我在同一目錄V2VM,這也是在其他兩個文件都位於。我已經嘗試將V2VM和VaporVisitor放在同一個軟件包中,但這也不起作用。因此,他們現在沒有任何計劃的一部分......

編輯2:VaporVisitor和V2VM

V2VM.java源代碼:

package vv; //whether I put this or not, it doesn't work 

//this stuff was provided, and is related to importing contents of the jar file; don't think this is the problem 
import cs132.util.ProblemException; 
import cs132.vapor.parser.VaporParser; 
import cs132.vapor.ast.VaporProgram; 
import cs132.vapor.ast.VBuiltIn.Op; 

import java.io.InputStreamReader; 
import java.io.IOException; 
import java.io.PrintStream; 

import vv.VaporVisitor; //whether I put this or not, it doesn't work 

public class V2VM{ 

public static void main(String [] args){ 

VaporProgram vp = parseVapor(System.in, System.err); 
VaporVisitor visitor = new VaporVisitor(); 

for(int i=0; i<vp.functions.length; i++){ 
for(int j=0; j<vp.functions[i].body.length; j++){ 
    vp.functions[i].body[j].accept(parameter, visitor); 
    } 
} 
} 

public static VaporProgram parseVapor(InputStream in, PrintStream err){ 
    ... 
} 

對於VaporVisitor.java:

package vv; 

public class VaporVisitor extends VInstr.VisitorPR<Parameter_Type, Return_Type, RuntimeException>{ 
    .... 
} 

所有3個文件位於同一目錄vv

+1

你是如何編譯的? (例如,一個IDE通常會爲你排序所有這些。) –

+2

你如何編譯這些類。向我們展示放置文件的目錄,您所在的目錄以及用於編譯文件的命令。粘貼您的確切錯誤消息。告訴我們這些課程在哪個包裏。 –

+0

我實際上使用終端,只是運行'javac'。如果我能理解我應該做什麼,而不是依賴於IDE,那將會很棒 – pauliwago

回答

9

好的。因此,首先,您永遠不會通過在名稱中附加.java來引用Java中的類。第二:爲了編譯一個使用另一個類B的類A,類B必須被編譯,並且可以在類路徑中使用。或者你必須同時編譯A和B.

所以,你應該有以下結構:

project 
    lib 
     someFile.jar 
    src 
     vv 
     V2VM.java 
     VaporVisitor.java 
    classes 

兩個類都應該開始:

package vv; 

沒有必要進口V2VM在VaporVisitor反之亦然,因爲它們是在相同的包裹。

要編譯的文件,你應該在項目目錄,並使用下面的命令:

javac -cp lib/someFile.jar -d classes src/vv/V2VM.java src/vv/VaporVisiotr.java 

這將編譯兩個文件一次,並且把他們的編譯的類文件的項目/類:

project 
    classes 
     vv 
     V2VM.class 
     VaporVisitor.class 

您將jar文件放入類路徑中,因爲您編譯的類使用此jar文件中的類。

然後,要運行你的類,你需要在classpath中同時包含jar文件和classes目錄。主要課程的完整名稱是vv.V2VM。因此,該命令是

java -cp lib/someFile.jar:classes vv.V2VM 

如果您使用的是Windows,則必須使用\代替/,並;而不是:

如果你想先編譯VaporVisiotr,然後編譯V2VM,你可以。但隨後你就必須做到以下幾點:

javac -cp lib/someFile.jar -d classes src/vv/VaporVisitor.java 

這隻編譯VaporVisiotr,並把它的類文件中project/classes。那麼你需要編譯V2VM,這取決於VaporVisitor。所以編譯的VaporVisitor類必須在類路徑中可用。因此,該命令是

javac -cp lib/someFile.jar:classes -d classes src/vv/V2VM.java 

如果你決定把VaporVisitor在另一個包(vv.foo爲例),那麼你就需要以下結構:

project 
    lib 
     someFile.jar 
    src 
     vv 
     V2VM.java 
     foo 
      VaporVisitor.java 
    classes 

的VaporVisitor.java需要先從

package vv.foo; 

而且V2VM.java文件需要有

package vv; 
import vv.foo.VaporVisitor; 

閱讀tutorial about packages

+0

真棒解釋! –