我能用compileOnly代替gradle中的annotationProcessor吗?

4

我的理解是注解处理器是指预先解析文件以查找某些注解的代码,根据此生成或更改其他代码。它发生在项目常规编译阶段之前。

在gradle中,我们通常使用apt、kpt-有时会使用annotationProcessor-来表示在"注解处理时间"需要某些依赖项。

如果上述理解正确,那么compileOnly与apt、kpt等有何不同?


我认为注解处理器只能生成代码,而不能修改它。 - K.Os
1个回答

9
正如您所说,Gradle中有几种注解处理解决方案:
  1. annotationProcessor 适用于Android
  2. apt 适用于纯Java和Groovy
  3. kapt 适用于Kotlin
等等。您甚至可以自己实现一个!所有这些都使用独立的 configuration 进行注解处理。
其中一些确实曾经使用 compile 类路径进行处理。但这不是语义上正确的,也不是 "Gradle方式"。您不应该将编译时依赖项与应用程序运行所需的构件混合在一起。我可以想到的一个简单场景是创建fat JAR:您很可能不希望打包和发布您使用的处理器,因为这没有意义!还可能有其他情况。
由于Gradle的灵活性,您可以创建另一个类路径(configuration)并仅将其用于注解处理,然后忘记它们。这是一种语义:您告诉Gradle(和其他开发人员),这些依赖项不需要您的应用程序运行。这就是 compileOnlyapt 的区别所在: compileOnly 依赖项对于您的代码操作是必需的,但它们是由环境提供的。无论是应用程序服务器、插件主机系统还是手动将它们添加到类路径中 - 它们只会在您的运行时存在,因此您不应该将它们与您的可分发内容一起打包。但是它们对于您的代码运行是必需的。 compileOnly 依赖项的一些示例是Servlet API(显然您的类扩展并使用它们,但服务器将提供它们)或者如果您正在编写Jenkins插件,则是Jenkins核心API(您的插件将安装在已经存在该核心的Jenkins中)。 JDK本身也是一种 compileOnly。相反,注解处理器根本不适合在运行时使用。它们不会存在于类路径中,也不需要运行您的应用程序:它们已经生成了稍后编译的一些代码。
"混合"配置的另一个影响是性能。让我引用一下Android文档:

在插件的之前版本中,编译类路径上的依赖关系会自动添加到处理器类路径上。也就是说,您可以将注解处理器添加到编译类路径上,并且它将按预期工作。然而,这样做会对性能造成显著影响,因为会向处理器添加大量不必要的依赖关系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接