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说它通常放在第一位,这是有道理的,所以我进行了相应的编辑。(类路径是按顺序搜索的,所以如果你有一个类的两个副本,一个在库中.,一个在库中,那么你可能希望.版本取代库版本,所以你需要先列出它。但当然,拥有两个不同的类副本通常不是一件好事!)
  • 您粘贴的内容看起来像 *nix shell,但您使用的是;,这是 Windows 预期的分隔符。(在 *nix 上,预期的分隔符是:。)这很可能是正确的,例如,如果您使用的是 Cygwin,但我想我会提到它以防万一。
于 2012-07-17T14:41:12.280 回答
0

如果您不搜索当前目录(您的类路径不会)javac,则不会将该目录添加为您的附加默认值。

此行为允许javac为项目(源代码文件集)一致地调用编译器,而与调用编译器的用户的目录无关。如果是其他方式,那么您必须确保始终从同一个工作目录编译以获得相同的结果。

----在看到ruakh的优秀答案的评论后进行编辑----

您看到的第二个问题与第一个问题无关。“找不到或加载主类”是因为您使用源代码文件名而不是该源代码文件中定义的类名java调用命令。

java命令运行类,而不是源代码文件。当您记住单个源代码文件可能包含多个类(即使它们通常不包含)时,这更有意义。

于 2012-07-17T14:47:03.920 回答