gradle - 我可以使用 compileOnly 作为 gradle 中 annotationProcessor 的替代品吗?

标签 gradle

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

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

如果上面的理解是对的,compileOnly怎么办?与 apt、kpt 等不同?

最佳答案

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

  • annotationProcessor Android 设备
  • apt 用于纯 Java 和 Groovy
  • kapt 适用于 Kotlin

  • 等等。你甚至可以自己实现一个!他们都使用单独的 configuration用于注释处理。

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

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

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

    In previous versions of the plugin, dependencies on the compile classpath were automatically added to the processor classpath. That is, you could add an annotation processor to the compile classpath and it would work as expected. However, this causes a significant impact to performance by adding a large number of unnecessary dependencies to the processor.

    关于gradle - 我可以使用 compileOnly 作为 gradle 中 annotationProcessor 的替代品吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47224294/

    相关文章:

    android - 找不到参数的方法 maven() [build_48jju0eu9q7aafln0yi713a7l$_run_closure1$_closure4@3cb5a1fe]

    java - 将 Gradle 依赖项保存到目录

    gradle - Gradle找不到我要建立的子目录

    spring - Liquibase变更集未在bootRepackage gradle任务中运行

    gradle - 什么是 .kotlin_builtins 文件,我可以从我的 uberjars 中省略它们吗?

    gradle - CorDapp JaCoCo代码覆盖率

    android - 启用 renderscript 使应用程序忽略 jniLibs

    android - Android Studio 3.0错误

    interface-builder - 如何在Gradle当前项目中添加其他项目?

    java - 在同一位置发布多个子项目 jar