指定注释处理器的顺序

2022-09-01 07:42:00

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

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

我制作了一个 SSCCE 测试用例

一个简单的 &足以证明这个问题 - 如果你在 App.java 中注释第 18 行并取消注释第 20-21 行,它将编译,即使第 18 行中的龙目岛符号创建了一个相同的构造函数。问题是龙目岛似乎在追逐匕首。git clonemvn compile


答案 1

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

我使用了龙目岛专家插件并破坏了整个事情,这并不完美,有些黑客,但至少产生了一个工作结果。为了能够帮助未来的谷歌用户来到这里,我将工作版本提交到存储库中。


答案 2

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

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

如有必要,您可以拆分编译过程并运行龙目岛,第一个编译步骤,然后再运行另一个编译步骤,而无需龙目岛,并且不覆盖操纵的文件(如果可能的话,我从未尝试过)。-proc:only


推荐