据我所知,在使用Gradle的annotationProcessor依赖关系处理程序时,您需要手动指定类路径中的内容。我正在寻找一种可能实现自动化的方法。
我感觉好像漏掉了什么,假设我有一个注解处理器my.processor
,它的依赖项是javapoet:
dependencies {
implementation 'com.squareup:javapoet:1.13.0'
}
但是,当需要将我的处理器应用于给定的类时,我需要手动指定JavaPoet必须出现在类路径中:
dependencies {
// (other dependencies)
annotationProcessor 'my:processor:1.0.0'
annotationProcessor 'com.squareup:javapoet:1.13.0'
}
如果我不这样做,它将抛出一个异常(如果我没记错的话,是TypeDefNotFoundException
),抱怨它找不到一个javapoet类-很明显,因为它不在类路径中。
有没有可能只写:
dependencies {
// (other dependencies)
annotationProcessor 'my:processor:1.0.0'
}
并且是否暗示了javapoet(或my.processor
的任何其他依赖项)的存在?
1条答案
按热度按时间sigwle7e1#
这很棘手,简单的回答是否定的,但我的逻辑是这样的。
将您的
my-processor
库标记为annotationProcessor
应该会转移您的暂时依赖项,这意味着javapoet
将通过implementation
依赖项位于类路径上。但是在你的项目中它不会被标记为annotationProcessor
。仅仅因为javapoet
可以被用在annotationProcessor
上并不意味着它应该被用在annotationProcessor
上。因此,您必须同时指定这两个注解处理器,因为您的第三方项目同时使用这两个注解处理器。我知道它是否有任何工作机会的唯一方法是,如果您在
my-processor
项目中将javapoet
指定为annotationProcessor
,并将my-processor
指定为具有某种暂时依赖关系的annotationProcess,则gradle会“知道”将javapoet
也作为annotationProcessor
进行调用。但我不知道这种情况是否存在,正如我所描述的这听起来是一个很大的范围。原因如下:考虑一下这个替代方案,
my-processor
在其代码库中有一些来自javapoet
的注解,用于内部运行,但它使用javapoet
作为annotationProcessor
来创建一些代码,以使其库能够工作。但没有附带备份也使用javapoet
的第三方项目。在这种情况下,javapoet
被标记为annotationProcessor
的事实将不会t也适用于其他依赖于my-processor
的项目。在这种情况下,您只需要注册my-processor
,而不需要注册javapoet
,这是预期的情况,因为第三方项目只使用my-processor
,而不使用javapoet
。这种情况看起来就像我上面描述的my-project
为javapoet
声明annotationProcessor
一样。在一种情况下,您希望与依赖项对annotationProcessor的使用隔离。在所需的情况下,您希望它暂时应用于第三方情况。但是这两种情况的配置是完全相同的,所以你不能区分开发人员想要发生什么,所以我的猜测是NO,你必须在直接使用这些库的项目中指定两个注解处理器。