2

我正在使用第 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 中的错误吗?如果是,是否有比我上面提到的两个更好的解决方法或快速修复?如果没有,我应该怎么解决这个问题?

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

4

4 回答 4

2

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

因此,要使用您的示例,我会这样做:

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

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

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

于 2011-10-07T15:24:03.020 回答
2

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

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

希望这对您有所帮助。

于 2011-02-04T08:43:09.980 回答
1

我们遇到了类似的问题,显然刚刚解决了它,所以想在 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 自动处理了这一点。

于 2012-11-27T07:36:42.793 回答
0

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

无法使用引用常量的参数解析生成的类 IF 处理注释的导入

解决方法包括

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