Java 注释处理器检查完全重建
Java Annotation processor check for full rebuild
我正在 Java 中创建注释处理器,我希望能够检查用户是否触发了完全重建。
我希望能够区分完全重建和仅构建几个文件。
这可能吗?或者有任何解决方法吗?
编辑 1:
我将解释我想要实现的目标。我有一个注释处理器和 10 个注释。其中 8 个注释生成一个名为 plugin.yml
的配置文件。其中 3 个注释(一个注释用于两个过程)用于生成名为 AutoRegister.java
的源文件。当我触发完全重建并且我的所有注释都得到处理时,这就像一个魅力。现在问题出现了,当我只编译时,可以说 15 个 classes 中的 3 个使用我的注释。然后 plugin.yml
和 AutoRegister.java
根据 3 个文件的注释生成,因此不完整。
我的解决方法是创建一个缓存文件,其中包含所有其他 classes 的信息,这些信息需要插入到两个文件 plugin.yml
和 AutoRegister.java
中。这有点管用,但无法从缓存中删除数据,例如,当我从 class 中删除注释时。所以从缓存中删除数据的唯一方法是删除缓存文件并触发完全重建。
我认为 'workaround' 这个词的意思与您认为的不同。如果有办法区分,那就是'the answer',而不是'the workaround'。如果您详细说明为什么需要这个,也许可以使用不同的解决方案,即不直接检测 'full rebuild' 与 'incremental build',但这足以满足您的需求。这是一种解决方法,但您必须解释为什么需要它,以便我们尽力帮助您。
以下是我能想到的最常见的原因:
假设您的 AP 将扫描所有源文件,并从中提取某种列表。例如,所有实现 com.derteufelqwe.MyAwesomeInterface
的 classes。然后,它将这个列表写在某个地方。说,META-INF/services/com.derteufelqwe.MyAwesomeInterface
。问题是:在增量构建期间,您只能看到所有源的一个子集,因此列表不完整,然后您将它写在需要写的地方,现在您有一个损坏的列表(因为它不完整)。
解决这个问题的方法是您可以向 Filer
询问源文件或 class 文件;即使它不是编译的一部分 运行 它仍然在源路径或 class 路径上,你会得到一个结果。因此,IF 您可以读取现有列表,并且您可以提取每个条目的来源或负责它的 class 文件(在我们假设的情况下,您正在创建一个服务文件,这很简单:条目本身就是一个完全限定的 class 名称,您可以要求文件管理器查找)然后您可以查询文件管理器该资源是否仍然存在。如果是,保留它,如果不是,删除它。现在您可以更新(而不是重新生成和替换)您的列表。
我正在 Java 中创建注释处理器,我希望能够检查用户是否触发了完全重建。 我希望能够区分完全重建和仅构建几个文件。
这可能吗?或者有任何解决方法吗?
编辑 1:
我将解释我想要实现的目标。我有一个注释处理器和 10 个注释。其中 8 个注释生成一个名为 plugin.yml
的配置文件。其中 3 个注释(一个注释用于两个过程)用于生成名为 AutoRegister.java
的源文件。当我触发完全重建并且我的所有注释都得到处理时,这就像一个魅力。现在问题出现了,当我只编译时,可以说 15 个 classes 中的 3 个使用我的注释。然后 plugin.yml
和 AutoRegister.java
根据 3 个文件的注释生成,因此不完整。
我的解决方法是创建一个缓存文件,其中包含所有其他 classes 的信息,这些信息需要插入到两个文件 plugin.yml
和 AutoRegister.java
中。这有点管用,但无法从缓存中删除数据,例如,当我从 class 中删除注释时。所以从缓存中删除数据的唯一方法是删除缓存文件并触发完全重建。
我认为 'workaround' 这个词的意思与您认为的不同。如果有办法区分,那就是'the answer',而不是'the workaround'。如果您详细说明为什么需要这个,也许可以使用不同的解决方案,即不直接检测 'full rebuild' 与 'incremental build',但这足以满足您的需求。这是一种解决方法,但您必须解释为什么需要它,以便我们尽力帮助您。
以下是我能想到的最常见的原因:
假设您的 AP 将扫描所有源文件,并从中提取某种列表。例如,所有实现 com.derteufelqwe.MyAwesomeInterface
的 classes。然后,它将这个列表写在某个地方。说,META-INF/services/com.derteufelqwe.MyAwesomeInterface
。问题是:在增量构建期间,您只能看到所有源的一个子集,因此列表不完整,然后您将它写在需要写的地方,现在您有一个损坏的列表(因为它不完整)。
解决这个问题的方法是您可以向 Filer
询问源文件或 class 文件;即使它不是编译的一部分 运行 它仍然在源路径或 class 路径上,你会得到一个结果。因此,IF 您可以读取现有列表,并且您可以提取每个条目的来源或负责它的 class 文件(在我们假设的情况下,您正在创建一个服务文件,这很简单:条目本身就是一个完全限定的 class 名称,您可以要求文件管理器查找)然后您可以查询文件管理器该资源是否仍然存在。如果是,保留它,如果不是,删除它。现在您可以更新(而不是重新生成和替换)您的列表。