我会定期遇到"type [blah] cannot be resolved. It is indirectly referenced from required .class files"
错误,并寻求帮助。
我搜索了这个站点和网络,所有许多类似的 问题似乎都可以通过向类路径添加类来解决。但在这种情况下,我很确定它们已经在类路径中。
这就是从一个非常大的元项目中缩减的情况。有两个 Eclipse 项目 ProjectOne 和 ProjectTwo。
这两个项目都由构建服务器发布到 Ivy 存储库,ProjectTwo 的 ivy.xml 引用该版本的 ProjectOne。但是,我保持常春藤“解决工作区中的依赖关系”首选项处于打开状态,这样我就可以在两个项目中工作,并解析到我修改过的类而不是发布的类。
ProjectOne 在我的工作区中编译(与 ProjectTwo 一样,除了(偶尔)“从所需的 .class 文件间接引用”问题。
结构基本上是这样的:
// ProjectOne
class Enum { **// I now suspect this name is the problem**
public static class EnumObjectCache {
}
// ProjectTwo
class Bar { **// Occasionally gets error about Enum$EnumObjectcache being unresolvable**
}
尽管有以下事实:
- 这只会影响 Eclipse。真正的编译器可以毫无问题地处理这一切
- ProjectTwo 的 ivy.xml 文件确实包含对 ProjectOne 的传递依赖。
- ProjectOne 存在于工作区中,并成功编译。
- 我总是打开“解决工作区中的依赖关系”。
- 不管事情如何解决,它应该工作类 Enum(和 EnumObjectCache)已经一年多没有改变了。
- 作为一个实验,我尝试将 ProjectOne 直接添加到 ProjectTwo 的类路径中(通过将其定义为必需的项目)。没变。
- 为了让这更有趣,这个问题并不总是发生,它只发生在这个非常大的代码库中的几个类上。哦,当它发生时,它总是在 Enum$EnumObjectCache 上。
- 它不会同时发生在团队中的每个开发人员身上。
问题发生时,会在多次“清理”和重新启动 Eclipse 后持续存在,并且 IVY 会重新解决。(虽然我没有做 Ivy clean-all-caches)。
10. 我可以通过从 ProjectOne 引入其他不必要的 Enum 导入来“解决”问题
注意:我以前没有尝试过清理缓存,因为它的速度非常慢(远程缓存是跨大西洋的,这是一个非常大的项目):清理所有缓存并重新解析需要 55 分钟,然后再重建大约 20 分钟。
但是,在清理所有缓存、重新解析和重建之后,我仍然遇到同样的问题。