6

Java ファイルをコンパイルしようとすると、次のエラー メッセージが表示されます。

$ javac -cp "bc-j-mapi-w-2.4.jar;apache-commons/*;json-org/*;lib/*" BrightcoveVideoQueryPOI.java
BrightcoveVideoQueryPOI.java:57: cannot find symbol
symbol  : class BrightcoveAPI
location: class BrightcoveVideoQueryPOI
        BrightcoveAPI brightcoveAPI = new BrightcoveAPI(BrightcoveAPI.PROD_READ_URL_TOKEN);
        ^
BrightcoveVideoQueryPOI.java:57: cannot find symbol
symbol  : class BrightcoveAPI
location: class BrightcoveVideoQueryPOI
        BrightcoveAPI brightcoveAPI = new BrightcoveAPI(BrightcoveAPI.PROD_READ_URL_TOKEN);
                                          ^
BrightcoveVideoQueryPOI.java:57: cannot find symbol
symbol  : variable BrightcoveAPI
location: class BrightcoveVideoQueryPOI
        BrightcoveAPI brightcoveAPI = new BrightcoveAPI(BrightcoveAPI.PROD_READ_URL_TOKEN);
                                                        ^
3 errors

これは、javac がクラス BrightcoveAPI を見つけられないことを示唆しています。同じディレクトリにあるため、何が問題なのかわかりません。

$ ls
apache-commons  bc-j-mapi-w-2.4.jar  BrightcoveAPI.class  BrightcoveAPI.java  BrightcoveVideoQueryPOI.java  json-org  lib
4

2 に答える 2

9

.クラスパスに (現在のディレクトリ)を含める必要があります。

javac -cp ".;bc-j-mapi-w-2.4.jar;apache-commons/*;json-org/*;lib/*" BrightcoveVideoQueryPOI.java

いくつかのメモ:

  • .はデフォルトのクラスパスにありますが-cp、明示的なクラスパスを指定する場合は、指定した場合にのみ含まれます。
  • この回答の以前のバージョンで.は、クラスパスの末尾に追加されていましたが、aioobeは、通常は最初に配置されていると述べています。これは理にかなっているため、それに応じて編集しました。(クラスパスは順番に検索されるため、クラスのコピーが 2 つ (.ライブラリ内に 1 つとライブラリ内に 1 つ) ある場合、おそらくその.バージョンをライブラリのバージョンよりも優先する必要があるため、最初にリストする必要があります。ただし、もちろん、通常、同じクラスのコピーを 2 つ持つことは良いことではありません!)
  • 貼り付けたものは *nix シェルのように見えますが;、Windows で期待される区切り記号である を使用しています。(*nix では、予想されるセパレーターは:です。) たとえば、Cygwin を使用している場合、これは正しいかもしれませんが、念のために言及しておきます。
于 2012-07-17T14:41:12.280 に答える
0

現在のディレクトリを検索しない場合 (クラスパスを検索しない場合) javac、そのディレクトリは追加のデフォルトとして追加されません。

この動作により、javacユーザーがコンパイラを呼び出したディレクトリに関係なく、プロジェクト (ソース コード ファイルのセット) に対して一貫してコンパイラを呼び出すことができます。他の方法である場合、同じ結果を得るには、常に同じ作業ディレクトリからコンパイルする必要があります。

---- ruakhの優れた回答でコメントを見た後に編集----

表示されている 2 番目の問題は、最初の問題とは関係ありません。「メイン クラスが見つからなかったか、ロードできませんでした」というメッセージは、ソース コード ファイルで定義されているクラス名ではなく、ソース コード ファイル名javaでコマンドを呼び出しているためです。

このjavaコマンドは、ソース コード ファイルではなく、クラスを実行します。これは、1 つのソース コード ファイルに複数のクラスが含まれる可能性があることを考えると (通常は含まれない場合でも) 、より理にかなっています。

于 2012-07-17T14:47:03.920 に答える