【发布时间】:2015-05-05 19:35:29
【问题描述】:
我编写了一个客户注释处理器来生成各种源文件,并包装在一个 Eclipse 插件中。作为此过程的一部分,它还使用通常的调用 ProcessingEnvironment#getMessager().printMesssage(Kind, String, Element) 记录各种错误和警告。
我一直在通过在 Eclipse 中调试插件来测试处理器。在 Eclipse 的启动子实例中,处理器都按预期工作 - 编译器根据需要生成、提取和解释源文件。生成和非生成中的任何编译器(即非自定义)错误都会按预期出现在编辑器、问题视图等中。
但是,就自定义错误和警告的显示方式而言,我发现很多不一致之处。我看到的行为如下:
- 如果未指定任何元素,则所有消息都会出现在错误日志中的信息类型下,无论记录错误时指定的种类如何。
- 如果消息类型为
NOTE,则无论是否指定元素,它始终显示在错误日志中的信息类型下。 - 否则,如果指定一个元素,错误和警告会间歇性地出现在问题视图和编辑器中;有时它们不会出现在任何地方。它们永远不会出现在错误日志中,无论 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
任何帮助表示赞赏,并提前非常感谢:)
【问题讨论】:
-
我注意到的一件事是 Eclipse 有它自己的类加载器(还有字节码修改工具?),它们有时会出现意想不到的行为,主要是为了让 IDE 中的用户体验更好。您可能已经想到了这一点,但是在代码的各个部分添加
new Throwable("debug message").printStackTrace()作为调试语句通常是我无法弄清楚其他任何内容时开始的地方。
标签: java eclipse eclipse-plugin annotation-processing