Javac可以';找不到同一目录中的类

Javac可以';找不到同一目录中的类,java,class,import,javac,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

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

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

javac -cp ".;bc-j-mapi-w-2.4.jar;apache-commons/*;json-org/*;lib/*" BrightcoveVideoQueryPOI.java
一些注意事项:

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

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

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

----在ruakh的精彩回答中看到评论后编辑----

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


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

通常,您会将
作为类路径中的第一个目录。太棒了,答案如此简单总是很好的!谢谢你提供的额外信息,是的,我正在使用Cygwin。现在一切都很好。我爱你就是因为这个,因为这个问题,我被困了两个小时。我用过;在linux中,由于有多个示例