5

私はJavaが初めてで、解決策を求めてWebを見回しましたが、どれもうまくいかないようです。私を助けてください。

私は2つのファイルを持っています。それらの 1 つは、main 関数を含む 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 というサブフォルダーにpackage vv;入れ、VaporVisitor に追加して 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 と同じディレクトリにいます。このディレクトリには、他の 2 つのファイルも配置されています。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

4

1 に答える 1

10

わかった。まず第一に.java、名前に追加して Java のクラスを参照することは決してありません。2 つ目: 別のクラス B を使用するクラス A をコンパイルするには、クラス B をコンパイルし、クラスパスで使用できるようにする必要があります。または、A と B の両方を同時にコンパイルする必要があります。

したがって、次の構造が必要です。

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

どちらのクラスも次のように開始する必要があります。

 package vv;

VaporVisitor に V2VM をインポートする必要はありません。また、その逆も同じです。これらは同じパッケージに含まれているためです。

ファイルをコンパイルするには、プロジェクト ディレクトリにいて、次のコマンドを使用する必要があります。

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

これにより、2 つのファイルが一度にコンパイルされ、コンパイルされたクラス ファイルが project/classes に配置されます。

project
   classes
      vv
         V2VM.class
         VaporVisitor.class

コンパイルするクラスはこのjarファイルのクラスを使用するため、jarファイルをクラスパスに配置します。

次に、クラスを実行するには、クラスパスに 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. 次に、VaporVisitor に依存する V2VM をコンパイルする必要があります。そのため、コンパイルされた 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;

パッケージに関するチュートリアルを読んでください。

于 2012-12-01T08:56:10.767 に答える