我编写了一个用于生成各种源文件的客户端注解处理器,并包装在Eclipse插件中。在此过程中,它还使用通常的调用ProcessingEnvironment#getMessager().printMessage(Kind,String,Element)
记录各种错误和警告。
我通过在Eclipse中调试插件来测试处理器。在启动的Eclipse子实例中,处理器都按预期工作 - 生成源文件,被编译器拾取并解释为所需的内容。所有生成的和未生成的编译器(即非自定义)错误会像预期的那样出现在编辑器中、问题视图等位置。
然而,我在自定义错误和警告方面看到了许多不一致的情况。我看到的行为如下:
- 如果未指定任何元素,则所有消息都以Info类型出现在错误日志中,无论在记录错误时指定的Kind是什么。
- 如果消息的种类为
NOTE
,则始终会在错误日志中以Info类型出现,无论是否指定了元素。 - 否则,如果指定了元素,错误和警告会间断性地出现在问题视图和编辑器中;有时它们根本不会出现。无论Kind是
ERROR
还是WARNING
,它们都不会出现在错误日志中。
如上所述,真正的问题是第3个 - 在某些情况下,我根本无法使错误显示在编辑器中,尽管已在有效元素上记录了这些错误。事实上,我已经成功地通过简单地更改特定生成的源文件的名称来使错误显示和不显示。
当然问题不在于文件名本身,但是如果生成与代码中已有引用匹配的类,则会隐藏错误,而生成具有不同名称(或根本没有)的类会导致错误显示(以及由于缺少类而引起的所有常规编译器错误)。最奇怪的是,与任何其他生成的类相比,该生成的类没有任何根本区别(其中有很多),尽管其结构和引用方式是独特的。它也相当长(约400个方法),但人为缩短它并没有什么影响。其他生成的类也具有代码中的现有引用,并不会抑制错误。
不幸的是,我还没有时间测试该问题是否发生在部署Eclipse插件时(即在“真实”Eclipse实例中运行),或者是否调用javac
显式调用或调用Maven构建时发生该问题。
如果没有发布插件的完整代码,我不希望有人能够直接提供帮助,但如果有人遇到注解处理器生成错误的问题,我非常乐意接受任何建议或建议。对我来说,这似乎是Eclipse中的一个错误,但我在网上没有找到任何参考资料。我也无法在底层Eclipse实例或启动的Eclipse子实例的.metadata / .log文件中找到任何错误。最后,我确保在注解处理器代码中没有抑制或报告任何异常。
Eclipse版本详细信息:
Version: Luna Service Release 1a (4.4.1)
Build id: 20150109-0600
任何帮助都受到赞赏,提前表示感谢 :)
任何帮助都受到赞赏,提前表示感谢 :)
new Throwable("debug message").printStackTrace()
作为调试语句是我的起点。 - Marco