使用-XDdev缺少注释处理器可以在不构建类文件的情况下成功构建

时间:2013-08-16 06:56:58

标签: java netbeans annotations javac

我今天遇到了一个奇怪的问题,并希望获得更多信息,因为我的google-fu证明不足够。

发生了什么

方案如下:我有一个简单的Netbeans项目,其中包含一个.java文件,该文件使用了一些注释,这些注释由Netbeans注释处理器处理(org.openide.filesystems.annotations.LayerGeneratingProcessor准确)在编译期间创建.xml文件。

所有这些工作都很好,直到今天,我不小心忘记将注释处理器的依赖项添加到我的新项目(即core/org-openide-filesystems.jar)。如果没有依赖关系,我目睹了最奇怪的行为:构建(通过Netbeans以及直接通过命令行上的ant)会报告成功,但根本没有生成.class个文件。

真正让我失望的是构建调用成功回来了。没有一个警告或其他指示器表示某些内容不对。只是没有生成类和一个只包含.jar个文件的小Bundle.properties文件,但同样没有.class个文件。

解决方法

对于场景本身来说太多了。过了一会儿,我终于找到了一个javac选项,它会让编译器最终告诉我出错了:-XDdev。我之前和之后从未在谷歌搜索中看到这个选项,我发现这些选项被称为隐藏选项。但我还没有找到一个很好的列表,列出了哪些隐藏选项可用以及它们有什么用处。任何有关这方面的参考将非常感激。

无论如何,将此选项添加到编译中,实际的javac调用会吐出一个大的堆栈跟踪,最终归结为ClassNotFoundException类的LayerGeneratorProcessor。瞧,一旦我将该类的依赖项添加到项目中,一切都会再次构建好。

剩下的问题

有趣的是(如在可怕的中)即使将此异常打印到stderr并指示注释处理失败,整个javac调用也会成功!它仍然会在构建成功的过程中恢复,并且好像一切都很好。如果没有-XDdev选项,则输出中的任何内容都不会出现任何错误。

最后,我的实际问题:是否有某种方法可以将此行为转换为正确的错误?虽然-XDdev可以很好地找出问题,但它需要您查看构建输出,尤其是在CI上下文中这是不可行的。我想通过某种方式将此行为转换为正确的构建错误来保护其他人和我自己不会意外地忘记将来的依赖性,以便我们在这些情况下也会通知CI系统。

0 个答案:

没有答案