当前位置: 首页 > 知识库问答 >
问题:

现在必须显式声明Kapt注释处理器

柳宪
2023-03-14

我正在尝试开发一个Kotlin AnnotationProcessor库,我想不出为什么会出现这个错误:

错误:任务“:app:javaprecompiledebug”执行失败。
>现在必须显式声明批注处理器。发现编译类路径上的以下依赖项包含注释处理器。请将它们添加到annotationProcessor配置中。
 · · · -compiler.jar(项目:编译器)
 · 或者,设置android.defaultconfig.javacompileOptions.AnnotationProcessorOptions.IncludeCompileClasspath=true以继续以前的行为。请注意,该选项不推荐使用,并将在将来删除。
 · 请参阅https://developer.android.com/r/tools/annotation-processor-error-message.html了解更多详细信息。

我知道我可以使用includeCompileClasspath=true,我试过了,它工作得很好。但是正如前面提到的,它已经不推荐使用了,很快就会被删除,预计它将被用于根据android Doc不使用的库。

所以我在找一个更干净的解决方案

hello.kt

@HelloGenerated
class Hello(){
    override fun showLog() {
        Log.i(Hello::class.simpleName, "${Gahfy_Hello().getName()}")
    }
}

Build.Gradle

依赖项{kapt project(“:compiler”)compileOnly project(“:compiler”)实现“org.jetbrains.kotlin:kotlin-reflect:$kotlin_version”}

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
annotation class HelloGenerated

我也尝试了没有目标和保留的情况,但有相同的问题

HelloGenerator.kt

@SupportedAnnotationTypes("net.gahfy.HelloGenerated")
class HelloGeneratedInjectorProcessor: AbstractProcessor() {

    override fun getSupportedAnnotationTypes(): MutableSet<String> {
        return mutableSetOf(HelloGenerated::class.java.name)
    }

    override fun getSupportedSourceVersion(): SourceVersion {
        return SourceVersion.latest()
    }

    override fun process(annotations: MutableSet<out TypeElement>, roundEnv: RoundEnvironment): Boolean {
        val annotation = annotations.firstOrNull { it.toString() == "net.gahfy.HelloGenerated" } ?: return false
        for (element in roundEnv.getElementsAnnotatedWith(annotation)) {
            val className = element.simpleName.toString()
            val `package` = processingEnv.elementUtils.getPackageOf(element).toString()
            generateClass(className, `package`)
        }
        return true
    }

    private fun generateClass(className: String, `package`: String) {
        val kotlinGeneratedPath = (processingEnv.options["kapt.kotlin.generated"] as String).replace("kaptKotlin", "kapt")
        val kaptKotlinGenerated = File(kotlinGeneratedPath)
        val source = "package $`package`\n\nclass Lachazette_$className(){fun getName():String{return \"World\"}}"
        val relativePath = `package`.replace('.', File.separatorChar)

        val folder = File(kaptKotlinGenerated, relativePath).apply { if(!exists()){mkdirs()} }
        File(folder, "Lachazette_$className.kt").writeText(source)
    }

    companion object {
        const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated"
    }
}

Build.Gradle

apply plugin: 'java-library'
apply plugin: 'kotlin'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"
net.gahfy.HelloGenerator
  • Kapt工作得很好,我正在与Dagger和BindingAdapter一起使用,没有任何问题
  • 在构建时,我的注释处理器得到了很好的处理,当我设置includeCompileClasspath=true
  • 时,日志中的消息就是好消息

非常感谢

共有1个答案

越季萌
2023-03-14

不确定这是否与您的问题100%相关,但在将auto-value移动到kapt后,我出现了同样的错误。我通过将auto-value依赖项声明为kaptannotationprocessor来解决这个问题。

所以在你的例子中:

dependencies{
    kapt project(":compiler")
    annotationProcessor project(":compiler")
    compileOnly project(":compiler")
    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
}
 类似资料: