我今天遇到了一个奇怪的问题,想获得更多关于这方面的信息,因为我的 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
. 我以前从未见过这个选项,从我的谷歌搜索中我只能找到这些选项被称为Hidden Options。但我还没有找到一个很好的列表,列出哪些隐藏选项可用以及它们有什么用处。对此的任何参考将不胜感激。
无论如何,将此选项添加到编译中,实际javac
调用会吐出一个大的堆栈跟踪,最终归结ClassNotFoundException
为LayerGeneratorProcessor
类的 a。瞧,一旦我将该类的依赖项添加到项目中,一切都会再次正常运行。
剩下的问题
有趣的是(就像在可怕的那样),即使这个异常被打印到 stderr 并表明注释处理失败,整个 javac 调用还是成功了!它仍然会随着构建成功返回,并且表现得好像一切都很好。如果没有该-XDdev
选项,甚至根本不会从输出中得到任何表明出现问题的迹象。
最后,我的实际问题是:有没有办法把这种行为变成正确的错误?虽然-XDdev
发现问题很好,但它需要您查看构建输出,尤其是在 CI 上下文中是不可行的。我想通过以某种方式将此行为切换为正确的构建错误来保护其他人和我自己不会在将来意外忘记依赖项,这样在这些情况下我们也会收到 CI 系统的通知。