【问题标题】:Eclipse 3.5+ - Annotation processor: Generated classes cannot be importedEclipse 3.5+ - 注释处理器:无法导入生成的类
【发布时间】:2010-08-27 00:34:39
【问题描述】:

我正在使用第 3 方注释处理器从项目中的注释类生成元数据代码(.java 文件)。 我已经通过 Eclipse(属性 -> Java 编译器 -> 注释处理)成功配置了处理器,并且代码生成工作正常(代码是自动创建和生成的)。此外,Eclipse 成功地自动完成了生成的类及其字段,没有任何错误。假设我有一个类“some.package.Foo”并且生成的元数据类是“some.package.Foo_”。在自动补全的帮助下,我可以在 Eclipse 编辑器中得到以下代码,没有任何错误:

import some.package.Foo_;
...
public class Test {
  void test() {
    Foo_.someField = null; // try to access a field from the generated class Foo_
  }
}

但是,一旦我实际构建项目(或仅保存文件,因为自动构建已启用),我就会收到错误消息,提示“some.package.Foo_”无法解决。 似乎 Eclipse 正在同时生成和编译 some.package.Foo_,或者更有可能。

我找到了两个临时解决方案(实际上首先阻碍了注释处理器的使用):

  1. 在生成的类的每个构建之前,右键单击每个生成的文件,转到“属性”并取消选中“派生”复选框。之后,我对项目进行了清理,并且导入很好 - 没有更多的错误。但是,如果我再做一次清理,错误会再次出现,因为文件的生成会导致再次检查“派生”标记(自动)。所以这真的很烦人也很耗时。
  2. 我还取消选中“派生”勾选 从所有这些文件中,这次 我取消选中“派生”勾选 源文件夹和包 包含这些文件。然后我禁用 注释处理器,然后 做清理。没有了 导入错误,即使我再做一次 清理,但没有任何好处 使用注释处理器, 因为如果我要改变一些东西 这将更新模型,我需要 打开注释处理器 重新开始,重复这个乏味的 关闭它的程序,之后 已生成新版本 那些文件。

这是 Eclipse 中的错误吗?如果是,是否有比我上面所说的两个更好的解决方法或快速修复?如果不是,我应该如何解决这个问题?

我还尝试在构建路径上重新排列库的顺序,但没有帮助。

【问题讨论】:

    标签: java eclipse import annotation-processing


    【解决方案1】:

    我假设您在最后一轮处理器中生成源。这不是推荐的方式,并且会导致您遇到的问题。 说明在这里:http://code.google.com/p/acris/wiki/CodeGenerationPlatform_Pitfall_Rounds

    所以我的建议是在常规处理轮次中生成源,最后一轮应该仅用于通知处理结束或类似情况。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      我有一个类似的问题,我发现的唯一一件事是它是 imports 特别是不起作用,但类本身的引用确实起作用。我使用的解决方法是在需要生成类的所有情况下都使用 FQCN(生成的类在同一个包中时除外,因为那时显然不需要导入)。

      所以要使用你的例子,我会这样做:

      public class Test {
        void test() {
          some.package.Foo_.someField = null; // try to access a field from the generated class Foo_
        }
      }
      

      我唯一的猜测是eclipse编译器在进行注释处理之前处理导入,恕我直言,这一定是eclipse中的一个错误。

      我知道这个问题已经存在一年多了,所以我很想知道您是否找到任何其他方法来解决它。

      【讨论】:

      • 我们与AndroidAnnotations 有完全相同的问题,在打开 Eclipse 时随机出现。尚未找到任何明确的解决方案,但更改注释处理文件夹名称“.apt_generated”会触发有时可以解决问题的构建。
      【解决方案3】:

      我们遇到了类似的问题,显然刚刚解决了它,所以想在 SO 上分享它,以防它对某人有所帮助。

      我们正在使用:

      • Eclipse Indigo(内部版本号:20120216-1857)
      • maven 的 m2e 连接器
      • 用于静态元模型类生成的 openJPA

      我们的问题:

      比如说,我们有一个名为 com.abc.xyz 的包和一个名为 OurEntity 的实体类。当我们构建项目(JPA、EJB、EAR 等,一开始都带有 mvn clean)时,就会生成元模型类。并在 PU 罐中得到适当的包装。但是当我们尝试导入生成的元模型类 com.abc.xyz.OurEntity_ 时,Eclipse 无法解析它。 OP显然已经过了这一点:-)。 Maven 构建失败,说它无法解析该类。谷歌没有太多帮助,除了一些错误报告,比如这个:https://bugs.eclipse.org/bugs/show_bug.cgi?id=350378
      该错误报告说导入整个包而不是单个类有帮助。所以,尝试了,但没有任何好处。它还说(David Heitzman 也是如此)使用完全限定的类名对他们有用。那也没用。

      解决办法:

      为需要使用元模型类的项目将 PU jar 添加到 Eclipse 构建路径。突然间所有的红色下划线都消失了(并不奇怪)。但担心的是同一只耳朵可能有两个 PU。但是 maven 自动处理了这一点。

      【讨论】:

        【解决方案4】:

        由于这个相当老的问题得到了一些关注,但没有指出 OP 特别要求的极可能的 eclipse 错误,我想用指向 eclipse 错误跟踪器的指针来补充上述答案:

        Cannot resolve import for generated class IF processing annotations with parameters referencing constants

        解决方法包括

        1. 对定义生成的类的包进行通配符导入(即import some.package.*;
        2. 使用生成的类的完全限定名称,即在代码中引用 some.package.Foo 而不是使用导入
        3. 切换到较新的 Eclipse。 Eclipse 4.4(又名 Luna)解决了这个特定的 Eclipse 错误。

        【讨论】:

          猜你喜欢
          • 2022-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多