指定注释处理器的顺序

时间:2015-03-22 11:31:07

标签: java dagger annotation-processing lombok

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

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

我制作了SSCCE test case

一个简单的git clone& mvn compile足以证明这个问题 - 如果您在App.java中注释第18行并取消注释第20-21行,它将进行编译,即使第18行中的Lombok表示法创建了相同的构造函数。问题是龙目岛似乎在Dagger之后运行。

3 个答案:

答案 0 :(得分:18)

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

我选择使用lombok-maven插件并对整个事物进行删除,这不是完美的,有点笨拙,但至少会产生一个有效的结果。希望它可以帮助未来的googlers来到这里,我将working version提交给了回购。

答案 1 :(得分:11)

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

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

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

答案 2 :(得分:6)

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

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

披露:我是龙目岛的开发者。