【问题标题】:Compilation with javac fails, with eclipse-compiler it works使用 javac 编译失败,使用 eclipse-compiler 可以正常工作
【发布时间】:2019-02-10 13:32:42
【问题描述】:

我正在尝试编写一个简单的 ant 构建来编译一个项目。 该项目在 eclipse 中,并且成功编译(使用 eclipse-compiler)。 但是使用 ant(使用 javac)会出现错误,我不知道如何解决。

所用罐子的结构:

  • com
    • xxx
      • 一个
      • b
    • a.class

我班的代码块:

Object o = com.xxx.a.b.method();
                    ^

蚂蚁的例外是:

错误:找不到符号

符号:变量 b

位置:a 类

我认为eclipse首先使用包来尝试编译代码。 javac 似乎认为 a 是类。

有没有办法在不改变jar的情况下解决问题?

【问题讨论】:

  • 也许你应该遵守Java约定:类名以大写开头,包全部小写...我刚刚发现:stackoverflow.com/q/9584086/85421
  • 这听起来像是javac vs. Eclipse 编译器,与 Ant 无关。是否可以在命令行上使用javac 重现此问题(如果可以,使用哪个 JDK 版本)?
  • 我用纯javac试过了。同样的错误。所以蚂蚁与它无关。我正在使用 Java 8。
  • 更新此问题的标题,并从您的来源中删除此类歧义。

标签: java eclipse javac


【解决方案1】:

看起来要么包名不同,要么你有多个同名的类文件。我建议在使用 javac 或 ant 命令编译时检查导入语句并将特定的 jar 文件添加到类路径。

要找到确切的 jar 文件,请使用ctrl+T,然后将您的类名粘贴到框中,它会告诉您 jar 文件。将该 jar 文件添加到您的 ant 类路径并构建。

【讨论】:

    【解决方案2】:

    我在Java Language Specification 中没有发现这是一个错误,所以它可能是一个javac 错误。

    由于它是 javac 与 Eclipse 编译器的事情,请尝试以下方法之一:

    • Use the Eclipse compiler in the Ant script
    • 如果是javac 错误,该错误可能会在更新的(更新)JDK 版本中修复
    • 如果您的代码不直接引用类 com.xxx.a,则编译使用 JAR 中删除类 com.xxx.a 的代码

    【讨论】:

    • 积极地说,JLS 第 6.5.1 节和第 6.5.5.2 节应该允许将已知类型名正确解析为所需类型。我尝试了一些 javac 和 ecj 似乎同意忽略这些规则的示例。在这种情况下,JLS 似乎被现实所推翻。如果 OTOH 检测到编译器之间的差异,则应该更有可能修复其中一个编译器中的指定行为。因此:是否存在编译器不同意的情况?
    猜你喜欢
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多