【问题标题】:Javac can't find class that is in the same directoryJavac 找不到在同一目录中的类
【发布时间】:2012-07-16 12:27:28
【问题描述】:

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

【问题讨论】:

    标签: java class import javac


    【解决方案1】:

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

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

    一些注意事项:

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

    【讨论】:

    • 通常您会将. 作为类路径中的第一个目录。
    • 太棒了,答案如此简单总是很好!
    • 感谢您提供的额外信息,是的,我正在使用 Cygwin。现在一切正常。
    • 我现在爱你,因为 : 问题停留了 2 个小时。我用了 ;由于多个示例,在 linux 中
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-28
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 2019-07-10
      • 2023-03-13
      相关资源
      最近更新 更多