首页 > 解决方案 > Java Annotation 处理器检查是否完全重建

问题描述

我正在用 Java 创建一个注释处理器,我希望能够检查用户是否触发了完全重建。我希望能够区分完全重建和只构建几个文件。

这可能吗?或者有什么解决方法吗?

编辑1:

我将解释我想要实现的目标。我有一个注释处理器和 10 个注释。其中 8 个注释会生成一个名为plugin.yml. 这些注释中的 3 个(两个进程中都使用一个注释)用于生成一个名为AutoRegister.java. 当我触发完全重建并且我的所有注释都得到处理时,这就像一个魅力。现在问题出现在我只编译时,假设 15 个类中的 3 个使用我的注释。然后根据这3个文件plugin.ymlAutoRegister.java注释生成,因此不完整。

我的解决方法是创建一个缓存文件,其中包含有关所有其他类的信息,这些信息需要插入到这两个文件plugin.ymlAutoRegister.java. 这有点工作,但无法从缓存中删除数据,例如当我从类中删除注释时。因此,从缓存中删除数据的唯一方法是删除缓存文件并触发完全重建。

标签: javamavenannotation-processing

解决方案


我不认为“解决方法”这个词意味着你认为它的意思。如果有办法区分,那将只是“答案”,而不是“解决方法”。如果您详细说明为什么需要这个,也许可以使用不同的解决方案,即不直接检测“完全重建”与“增量构建”,但这足以满足您的需求。那将是一种解决方法,但您必须解释为什么需要它,以便我们尝试帮助您。

这是我能想到的为什么你需要这个的最常见原因:

假设您的 AP 将扫描所有源文件,并从中提取某种列表。例如,所有实现com.derteufelqwe.MyAwesomeInterface. 然后,它在某个地方写下这个列表。说,META-INF/services/com.derteufelqwe.MyAwesomeInterface。问题是:在增量构建期间,您只能看到所有源的子集,因此列表不完整,然后您将其写入需要写入的任何位置,现在您的列表已损坏(因为它不完整)。

解决此问题的方法是您可以要求Filer提供源文件或类文件;即使它不是编译运行的一部分,它仍然在源路径或类路径上,你会得到一个结果。因此,如果您可以读取现有列表,并且您可以提取每个条目的源文件或类文件(在我们创建服务文件的假设情况下,这很简单:条目本身就是一个完全限定的类名,您可以要求 Filer 查找)然后您可以查询该资源是否仍然存在。如果是,请保留它,如果不是,请删除它。现在您可以更新(而不是重新生成和替换)您的列表。


推荐阅读