Eclipse 3.5+ - 注释处理器:无法导入生成的类

时间:2010-08-27 00:34:40

标签: java eclipse import annotation-processing

我正在使用第三方注释处理器从项目中带注释的类生成元数据代码(.java文件)。 我已经通过Eclipse(Properties - > Java Compiler - > Annotation Processing)成功配置了处理器,并且代码生成工作正常(代码自动创建和生成)。此外,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_
  }
}

但是,只要我实际构建项目(或者只是保存文件,因为自动启用了Build),我就会收到错误消息,告知“some.package.Foo_”无法解析。 看起来Eclipse正在同时生成和编译some.package.Foo_,或者更有可能。

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

  1. 在每次生成所生成的类之前,右键单击每个生成的文件,转到“属性”,然后取消选中“派生”标记。在那之后,我进行项目的清理并且导入很好 - 没有更多的错误。但是,如果我再次进行清理,则会再次显示错误,因为文件的生成会导致再次(自动)检查“派生”标记。所以这真非常烦人且费时。
  2. 我也取消选中“Derived”标记     来自所有这些文件,这一次     我取消选中“衍生”标记     源文件夹和包哪个     包含那些文件。然后我禁用     注释处理器,然后     做清理工作。没有了     导入错误,即使我做了另一个错误     清理,但没有任何好处     使用注释处理器,     因为如果我要改变一些东西     我需要更新模型     转动注释处理器     回来,重复这个乏味     在它之后关闭它的程序     已经生成了新版本     那些文件。
  3. 这是Eclipse中的错误吗?如果是,是否有比上述两个更好的解决方法或快速解决方案?如果没有,我应该尝试解决这个问题?

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

4 个答案:

答案 0 :(得分:2)

我假设您在最后一轮处理器中生成了源代码。这不是推荐的方式,并且完全导致您遇到的问题。 解释如下:http://code.google.com/p/acris/wiki/CodeGenerationPlatform_Pitfall_Rounds

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

希望这可以帮到你。

答案 1 :(得分: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中一定是个错误。

我知道这个问题已经超过一年了,所以我很想知道你是否找到了其他方法来解决它。

答案 2 :(得分:1)

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

我们正在使用:

  • Eclipse Indigo(Build id:20120216-1857)
  • m2e maven连接器
  • openJPA for static metamodel class generation

我们的问题:

说,我们有一个名为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会自动处理这个问题。

答案 3 :(得分:0)

由于这个相当古老的问题得到了一些关注而没有指出OP特别要求的非常可能的日食错误,我想用指向日食bug追踪器的指针来补充上述答案:

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错误。