2012-12-01 22 views
5

Sono nuovo di Java e ho cercato sul Web soluzioni ma nessuna sembra funzionare. Mi aiuti per favore.Importa classe Java personalizzata

Ho due file. Uno di questi è il file java che contiene la funzione principale. In esso:

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

Con questo comando, voglio creare un nuovo oggetto VaporVisitor, che è una classe in un file separato chiamato VaporVisitor.java. Tuttavia Java non riconosce cosa sia VaporVisitor, presumibilmente perché non sa che esiste VaporVisitor.java (è nella stessa directory). Ho provato a renderli parte dello stesso pacchetto, in diversi pacchetti e importazione ... e tutti hanno fallito. Qualcuno può darmi qualche consiglio?

Grazie!

EDIT: Ecco esattamente cosa sto facendo e il messaggio di errore che ottengo: Quindi ho 3 file. V2VM (con la mia funzione principale), VaporVisitor e un file jar fornito con diverse classi personalizzate. Il file jar non mi sta dando problemi; sta cercando di fare in modo che java riconosca VaporVisitor.

Quindi in V2VM (la funzione principale), ho provato a inserire: import V2VM.java; che non ha funzionato. Ho provato a inserire V2VM in una sottocartella chiamata vv, aggiunto package vv; a VaporVisitor e inserito in V2VM.java import vv.* ma non ha funzionato neanche.

Per la compilazione, ho cercato javac -classpath [the jar file].jar V2VM.java

Gli errori che mi dà:

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(); 
         ^

Quando eseguo javacc Io sono nella stessa directory V2VM, che è anche il luogo dove si trovano gli altri due file . Ho provato a mettere V2VM e VaporVisitor nello stesso pacchetto, ma anche questo non ha funzionato. Così non fanno parte di qualsiasi pacchetto ora ...

EDIT 2: CODICE SORGENTE DI VaporVisitor e 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){ 
    ... 
} 

Per VaporVisitor.java:

package vv; 

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

Tutti i 3 file si trovano nella stessa directory vv

+1

Come state compilando? (Un IDE normalmente ordinerebbe tutto questo per te, per esempio.) –

+2

Come si compila quelle classi. Mostraci le directory in cui sono posizionati i file, la directory in cui ti trovi e il comando utilizzato per compilare i file. Incolla il messaggio di errore esatto che hai. Dicci in quale pacchetto sono le classi. –

+0

In realtà sto usando il terminale e sto usando 'javac'. Sarebbe bello se potessi capire cosa dovrei fare invece di affidarmi all'IDE se possibile – pauliwago

risposta

9

OK. Quindi, prima di tutto, non si fa mai riferimento a una classe in Java aggiungendo .java al suo nome. Secondo: per compilare una classe A che usa un'altra classe B, la classe B deve essere compilata e disponibile nel classpath. Oppure è necessario compilare sia A che B contemporaneamente.

Quindi, si dovrebbe avere la seguente struttura:

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

Entrambe le classi dovrebbero iniziare con:

package vv; 

Non c'è bisogno di importare V2VM in VaporVisitor o viceversa, dal momento che sono in stesso pacchetto.

per compilare i file, si dovrebbe essere nella directory del progetto, e utilizzare il seguente comando:

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

Questo compilerà i due file contemporaneamente, e mettere le loro file di classe compilati nel progetto/classi:

Si inserisce il file jar nel classpath poiché le classi che si compilano utilizzano le classi da questo file jar.

Quindi, per eseguire la classe, è necessario disporre sia del file jar che della directory classes nel classpath. E il nome completamente simile della classe principale è vv.V2VM. Quindi il comando è

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

Se siete su Windows, è necessario utilizzare \ invece di /, e ; invece di :.

Se si desidera compilare prima VaporVisiotr e poi V2VM, è possibile. Ma allora si dovrebbe effettuare le seguenti operazioni:

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

Questo compila solo VaporVisiotr, e mettere il suo file di classe in project/classes. Quindi è necessario compilare V2VM, che dipende da VaporVisitor. Quindi la classe VaporVisitor compilata deve essere disponibile nel classpath. Quindi il comando è

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

Se avete deciso di mettere VaporVisitor in un altro pacchetto (vv.foo per esempio), allora si avrebbe bisogno la seguente struttura:

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

Il VaporVisitor.java avrebbe bisogno di iniziare con

package vv.foo; 

e il file V2VM.java avrebbe bisogno di avere

package vv; 
import vv.foo.VaporVisitor; 

Leggi il tutorial about packages.

+0

spiegazione impressionante! –

Problemi correlati