指定注释处理器的顺序

我正在尝试在我的Java项目上运行Dagger 2和Lombok。 当然,龙目岛必须首先运行,但实际上它是否真的有机会。 起初我怀疑我可以通过类路径中库jar的相应位置来指定顺序,但是该顺序显然会被忽略。

有没有办法指定它们以某种方式运行的顺序,或者我只是不得不忍受不能组合两个AP?

我制作了一个SSCCE测试用例 。

一个简单的git clonemvn compile足以certificate这个问题 – 如果你在App.java中注释第18行并取消注释第20-21行,它就会编译,即使第18行中的Lombok表示法创建了一个相同的构造函数。 问题是龙目岛似乎追随Dagger。

在经过大量研究并与其中一个Lombok开发人员交谈之后,事实certificate,因为javac基于hashCode()进行类加载,在这种情况下运行的注释处理器的顺序基本上是随机的,更糟糕​​的是,在多个之间随机运行。 目前似乎没有解决这个问题的方法。

我选择了lombok-maven插件,然后将整个事情搞砸了,这不是完美而且有点笨拙,但至少会产生一个有效的结果。 希望它可以帮助未来的googlers来到这里,我将工作版本提交给了回购。

理想情况下,订单无关紧要。 注释处理器应该只创建文件 – 无论何时创建文件,另一个处理轮开始,其他处理器有机会再次使用新文件。 在这种情况下,订单并不重要,所以我认为没有官方的方法来强制处理器的订单。 问题是Lombok处理器操纵现有文件而不是创建新文件,这是不应该做的。 某些编译器可能有订购处理器的选项或使用处理器加载或出现在命令行参数中的顺序,但这取决于编译器的实现。

您可以尝试查看Daggers和Lombok的构建过程,并查看在那里调用的处理器。 然后以正确的顺序在maven构建中明确设置这些处理器并测试不同的编译器,看看它们是否按此顺序运行。

如果有必要,您可以拆分编译过程并使用-proc:only首先运行Lombok,然后再运行没有Lombok的另一个编译步骤,并且不覆盖被操作的文件(如果可能的话,我从未尝试过)。

可以使用-processor标志在javac中指定注释处理器的顺序。 但是,即使使用此参数集,我也没有得到编译。 我怀疑匕首直接查看源代码,或者注释处理器API在同一轮中调度注释处理器,并且不会传播lombok的修改。

我认为现在最强大的解决方案是使用delombok来强制执行订单。

披露:我是Lombok开发人员。