我可以在gradle中使用compileOnly替代注解处理器吗?

Hum*_*ent 2 gradle

我对批注处理器的当前理解是,它指的是预先准备文件以查找某些批注的代码,然后基于该代码生成或更改其他代码。它发生在项目的常规编译阶段之前。

在gradle中,我们通常使用apt,kpt-我有时看到使用annotationProcessor-表示在“注释处理时”需要一些依赖。

如果上面的理解是正确的,那么compileOnly与apt,kpt等有什么不同?

mad*_*ead 5

如您所说,Gradle中有几个注释处理解决方案:

  1. annotationProcessor Android的设施
  2. apt 用于纯Java和Groovy
  3. kapt 对于科特林

等等。您甚至可以自己实现!它们全部使用单独configuration的注释处理。

实际上,其中一些确实曾经使用compile类路径进行处理。但这在语义上不是正确的,它不是“渐变方式”。您不应将仅编译时的依赖项与应用程序运行所需的工件混合在一起。我可以想到的一种简单情况是创建胖的JAR:您很可能不想打包和运送所用的处理器,因为这没有任何意义!可能还有其他情况。

多亏了Gradle的灵活性,您可以做的是创建另一个类路径(configuration),并将其仅用于注释处理,然后再忽略它们。这是一种语义:您要告诉Gradle(和其他开发人员),应用程序运行不需要这些依赖关系。这是与以下地方compileOnly不同的地方aptcompileOnly依赖关系是代码操作所必需的,但它们是由环境提供的。它将是您的应用程序服务器,还是插件宿主系统,或者甚至是将它们手动添加到类路径中-它们将仅存在于运行时中,因此您不应将它们与可分发文件打包在一起。但是它们是运行代码所必需的。一些例子compileOnly依赖项是Servlet API(您的类显然可以扩展并使用它们,但是它将由服务器提供),或者,如果您正在编写Jenkins插件,则使用Jenkins核心API(您的插件将安装在已经存在该核心的Jenkins中) )。JDK本身也是一种compileOnly。相反,注解处理器根本不打算在运行时使用。它们在classpath上将不存在,并且不需要它们来运行您的应用程序:它们已经生成了一些代码,这些代码稍后会被编译。

“混合”配置的其他含义是性能。请允许我引用Android的文档:

在该插件的早期版本中,对编译类路径的依赖项已自动添加到处理器类路径中。也就是说,您可以将注释处理器添加到编译类路径中,并且它将按预期工作。但是,这会通过向处理器添加大量不必要的依赖关系而对性能产生重大影响。