我正在尝试使用 Maven 插件和 m2eclipse-android-plugin 在 Eclipse 中创建 Android 应用程序。 直到最近,一切都进展顺利。 我在 Ubuntu 上使用 Helios,并拥有最新的 JDK(删除了 Ubuntu 安装的默认版本)。
该项目引用了我也创建的两个库。 一个是 Android 特定的实用程序项目并生成 .apklib(成功)。 另一个库是一组更通用的实用程序,不特定于 Android,它会生成 JAR 文件。 这两个项目也是使用 Eclipse 的 Maven 插件构建的。 此外,我还验证了 .apklib 和 .jar 文件都在本地存储库中,并且都包含了预期的所有生成的类文件。
当构建 .apk 文件时,我在 Android 项目中的某个类上收到“无法找到符号”的信息,其中该符号是来自非 Android 实用程序 JAR 文件的类。 由于某些完全奇怪的原因,在 JAR 文件中找不到类文件。 我验证了,事实上,JAR 文件位于我的本地 Maven 存储库中,并且类文件位于 JAR 文件中。 我还运行了 Maven 安装命令并进行了调试,复制了输入到 Java 编译器中的命令行。 当我在控制台中执行该命令时,我收到相同的错误(表明这是 Java 编译器错误而不是 Maven 错误)。
以前有其他人遇到过这种情况吗? 这非常奇怪,我已经彻底梳理了命令行中的潜在问题,据我所知,一切似乎都是正确的。
好吧,通过看似反复试验,我似乎已经解决了这个问题。 我有一个看起来与此“相似”的文件:
import Test.TestObserver;
import com.myself.ImportedClassThatCouldntBeFound;
class Test extends ImportedClassThatCouldntBeFound {
public interface TestObserver {
public void event ();
}
public void addObserver (TestObserver observer) {
...
}
}
public class AnotherTest {
private Test test = new Test ();
public void blah () {
this.test.addObserver (new TestObserver () {
public void event () {
...
}
});
}
}
问题发生在文件的顶部。 由于某种原因,Eclipse导入了内部接口!
当我“删除”该导入,然后将 AnotherTest 更改为:
public class AnotherTest {
private Test test = new Test ();
public void blah () {
this.test.addObserver (new Test.TestObserver () {
public void event () {
...
}
});
}
}
编译正确! 我什至通过将导入放回到文件中并删除完全声明的接口名称来验证它,这导致它再次失败! 这绝对是我见过的最疯狂的编译器问题之一,一旦我重新开始研究这个问题的四个小时,我将进一步调查为什么会发生这种情况。
这将是我第一次在 StackOverflow 上这样做,但我会将其标记为解决方案,因为这绝对是问题所在。 然而,它肯定需要更多的研究(至少就我而言)来尝试理解是什么导致编译器变得如此混乱。
编辑了此内容,以表明具有内部接口的类正在扩展编译时找不到的类
对我来说,这看起来像是(最终)由于将两个顶级类放入单个源代码文件而引起的问题。 这通常被认为是不好的做法。
目前尚不清楚该编译错误是否是 JLS 强制规定的,是否是 Java 编译器中的错误。 但无论哪种方式,最好的解决方法是不要将多个类放入一个源文件中。