我的理解是注解处理器是指预先解析文件以查找某些注解的代码,根据此生成或更改其他代码。它发生在项目常规编译阶段之前。
在gradle中,我们通常使用apt、kpt-有时会使用annotationProcessor
-来表示在"注解处理时间"需要某些依赖项。
如果上述理解正确,那么compileOnly
与apt、kpt等有何不同?
我的理解是注解处理器是指预先解析文件以查找某些注解的代码,根据此生成或更改其他代码。它发生在项目常规编译阶段之前。
在gradle中,我们通常使用apt、kpt-有时会使用annotationProcessor
-来表示在"注解处理时间"需要某些依赖项。
如果上述理解正确,那么compileOnly
与apt、kpt等有何不同?
annotationProcessor
适用于Androidapt
适用于纯Java和Groovykapt
适用于Kotlinconfiguration
进行注解处理。compile
类路径进行处理。但这不是语义上正确的,也不是 "Gradle方式"。您不应该将编译时依赖项与应用程序运行所需的构件混合在一起。我可以想到的一个简单场景是创建fat JAR:您很可能不希望打包和发布您使用的处理器,因为这没有意义!还可能有其他情况。configuration
)并仅将其用于注解处理,然后忘记它们。这是一种语义:您告诉Gradle(和其他开发人员),这些依赖项不需要您的应用程序运行。这就是 compileOnly
与 apt
的区别所在: compileOnly
依赖项对于您的代码操作是必需的,但它们是由环境提供的。无论是应用程序服务器、插件主机系统还是手动将它们添加到类路径中 - 它们只会在您的运行时存在,因此您不应该将它们与您的可分发内容一起打包。但是它们对于您的代码运行是必需的。 compileOnly
依赖项的一些示例是Servlet API(显然您的类扩展并使用它们,但服务器将提供它们)或者如果您正在编写Jenkins插件,则是Jenkins核心API(您的插件将安装在已经存在该核心的Jenkins中)。 JDK本身也是一种 compileOnly
。相反,注解处理器根本不适合在运行时使用。它们不会存在于类路径中,也不需要运行您的应用程序:它们已经生成了稍后编译的一些代码。在插件的之前版本中,编译类路径上的依赖关系会自动添加到处理器类路径上。也就是说,您可以将注解处理器添加到编译类路径上,并且它将按预期工作。然而,这样做会对性能造成显著影响,因为会向处理器添加大量不必要的依赖关系。