groovy 外部gradle annotationProcessor是否可以暗示其依赖关系?

lnlaulya  于 2023-03-01  发布在  其他
关注(0)|答案(1)|浏览(148)

据我所知,在使用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的任何其他依赖项)的存在?

sigwle7e

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-projectjavapoet声明annotationProcessor一样。在一种情况下,您希望与依赖项对annotationProcessor的使用隔离。在所需的情况下,您希望它暂时应用于第三方情况。但是这两种情况的配置是完全相同的,所以你不能区分开发人员想要发生什么,所以我的猜测是NO,你必须在直接使用这些库的项目中指定两个注解处理器。

相关问题