【问题标题】:Eclipse JDT compiler says method is undefined, but Eclipse IDE doesn'tEclipse JDT 编译器说方法未定义,但 Eclipse IDE 没有
【发布时间】:2017-07-13 20:33:15
【问题描述】:

我正在使用一个名为 iText 的库(使用 JAR 文件添加到项目中)。它的 API 可以在这里看到:https://coderanch.com/how-to/javadoc/itext-2.1.7/com/lowagie/text/Image.html

在我的项目中,我有一个简单的 Java 文件,名为 Worker.java,它使用了这个库:

import com.lowagie.text.Image;
public class Worker {
    public void createDetails() {
        Image img;
        try {
            img = Image.getInstance("...");
            float h = img.getHeight();
            float w = img.getWidth();
            ...
        } catch (Exception e) {...}
    }
}

在上面的代码中,Image 对象的高度是使用img.getHeight() 函数检索的。此函数是 Image 类扩展的 com.lowagie.text.Rectangle 类的一部分。

在 Eclipse 中编译此代码时,IDE 很快识别出该函数来自Rectangle 类并编译没有任何错误。

但是,如果我使用独立的ecj-4.4.jar文件通过批处理编译器(BatchCompiler.compile(...))编译项目,编译器会报告以下错误:

1. ERROR in C:\...\Worker.java (at line 7)
        float h = img.getHeight();
                      ^^^^^^^^^
The method getHeight() is undefined for the type Image
----------

我只是想不通为什么会抛出这个错误。如果这是一个真正的错误,那么为什么 Eclipse 不报告它呢?

编辑:类路径中有这个 JAR 的两个版本,这就是错误似乎出现的原因。不幸的是,由于这是一个多人参与的大型项目,我无法从项目中删除重复的 JAR。但是,Eclipse IDE 在为该方法查找正确的 JAR 时似乎没有任何问题,那么为什么编译器会出现这个问题呢?

【问题讨论】:

  • 正如我的回答已经表明的那样:在两个类路径中拥有相同的 jar 不仅很重要,而且 jar 的顺序也很重要。通常按顺序搜索 jars,找到的第一个类定义是加载的。
  • Eclipse IDE 是如何找到方法的?
  • 我猜这个库有两个版本,一个有这个方法,另一个没有。 Eclipse 很可能在其类路径中首先具有该方法的版本,而批处理编译器可能首先具有缺少方法的版本。

标签: java eclipse eclipse-jdt ecj


【解决方案1】:

虽然 eclipse 从相应的项目中获取它的类路径设置,但批处理编译器没有。您必须将您的库包含到您的类路径中。

查看the batch compiler's documentation here 并查看 -cp 选项。您应该在那里包含相应的库。

编辑:在两个类路径中拥有相同的 jar 是不够的。您还必须考虑订单。

【讨论】:

  • 感谢您的回复。但是,我已经在使用 -classpath 选项为其提供 JAR
  • 想告诉我们您正在使用的命令行吗?也许这是对正确方向的暗示。
  • 这不能解释 that 错误消息。如果编译器找不到库类Image,它会报错。
  • 如果找不到那就对了。但也有可能两者包含不同版本的 jar。
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2016-11-11
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
相关资源
最近更新 更多