Javac找不到位于同一目录中的类

时间:2012-07-17 14:39:27

标签: java class import javac

我正在尝试编译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

2 个答案:

答案 0 :(得分:9)

您需要在类路径中包含.(当前目录):

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

一些注意事项:

  • .位于默认的类路径中,但如果使用-cp指定显式类路径,则仅在指定时才包含它。
  • 此答案的先前版本将.添加到类路径的末尾,但aioobe表示它通常放在第一位,这是有意义的,所以我已经相应地进行了编辑。 (按顺序搜索类路径,所以如果你有一个类的两个副本,一个在.中,一个在库中,那么你可能希望.版本取代库版本,所以你需要先列出它。但是,当然,拥有两个不同的类副本通常不是一件好事!)
  • 您粘贴的内容看起来像* nix shell,但您使用的是;,这是Windows上预期的分隔符。 (在* nix上,预期的分隔符为:。)这可能是正确的,例如如果你正在使用Cygwin,但我想我会提到它以防万一。

答案 1 :(得分:0)

如果您没有搜索当前目录(您的班级路径没有),javac不会为您添加该目录作为其他默认目录。

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

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

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

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