指定注释处理器的顺序

Specifying order of annotation processors

我正在尝试 运行 Dagger 2 以及 Lombok 在我的 Java 项目中。当然,Lombok 必须首先 运行,但它是否真的这样做似乎取决于机会。起初我怀疑我可以通过 class 路径中库 jar 的相应位置指定顺序,但该顺序显然被忽略了。

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

我制作了一个SSCCE test case

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

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

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

如有必要,您可以首先将编译过程和 运行 Lombok 与 -proc:only 分开,然后再进行另一个没有 Lombok 且不覆盖操作文件的编译步骤(如果可能的话,我从不试过了)。

可以使用 -processor 标志在 javac 中指定注释处理器的顺序。但是,即使设置了这个参数,我也没有得到编译。我怀疑dagger直接看源码,或者注解处理器API在同一轮调度注解处理器,lombok的修改没有传播

我觉得现在最稳健的办法就是用delombok强制下单

披露:我是 Lombok 开发人员。

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

我使用了 lombok-maven 插件并对整个事情进行了 delomboking,这并不完美而且有点老套,但至少产生了一个有效的结果。希望它可以帮助未来的 googlers 来到这里,我将 working version 提交给 repo。