2

我会定期遇到"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**
   }

尽管有以下事实:

  1. 这只会影响 Eclipse。真正的编译器可以毫无问题地处理这一切
  2. ProjectTwo 的 ivy.xml 文件确实包含对 ProjectOne 的传递依赖。
  3. ProjectOne 存在于工作区中,并成功编译。
  4. 我总是打开“解决工作区中的依赖关系”。
  5. 不管事情如何解决,它应该工作类 Enum(和 EnumObjectCache)已经一年多没有改变了。
  6. 作为一个实验,我尝试将 ProjectOne 直接添加到 ProjectTwo 的类路径中(通过将其定义为必需的项目)。没变。
  7. 为了让这更有趣,这个问题并不总是发生,它只发生在这个非常大的代码库中的几个类上。哦,当它发生时,它总是在 Enum$EnumObjectCache 上。
  8. 它不会同时发生在团队中的每个开发人员身上。
  9. 问题发生时,会在多次“清理”和重新启动 Eclipse 后持续存在,并且 IVY 会重新解决。(虽然我没有做 Ivy clean-all-caches)。

    10. 我可以通过从 ProjectOne 引入其他不必要的 Enum 导入来“解决”问题

注意:我以前没有尝试过清理缓存,因为它的速度非常慢(远程缓存是跨大西洋的,这是一个非常大的项目):清理所有缓存并重新解析需要 55 分钟,然后再重建大约 20 分钟。

但是,在清理所有缓存、重新解析和重建之后,我仍然遇到同样的问题。

4

0 回答 0