【问题标题】:Generated java source code not found by kotlin compilerkotlin 编译器找不到生成的 java 源代码
【发布时间】:2020-08-20 17:32:38
【问题描述】:

我正在编写一个 gradle 插件来生成 Java 代码。我的插件生成基于 Android R 类的代码,因此它依赖于

processVariantResources

任务。在我的插件中,我使用这段代码来做到这一点:

class MyPlugin : Plugin<Project> {
override fun apply(project: Project) {

    val extension = project.extensions.create<MyPluginExtension>(PLUGIN_NAME, MyPluginExtension::class.java)
    project.tasks.whenTaskAdded { task ->
        if (task.name.startsWith("process") && task.name.contains("Resources") && !task.name.contains("Test")) {
            val index = task.name.indexOf("Resources")
            val variantName = task.name.substring(7, index)

            //Create my task and add it to the project, make it dependent on processResources
            project.task("my${variantName}ResourceTask") {
                it.doLast {
                    generateSomeCodeForVariant(project, extension, variantName)
                }
                taskList.add(it)
            }.dependsOn(task)
        }
    }

    project.afterEvaluate {
            val appExtension = project.extensions.findByType(AppExtension::class.java)
            appExtension?.applicationVariants?.all { variant ->
                val myTask = project.tasks.getByName("my${variant.name.capitalize()}ResourcesTask")
                    val outputDir = "${project.buildDir}/generated/source/myplugin/${variant.name}"

                    //register my task as java generating
                    variant.registerJavaGeneratingTask(myTask, File(outputDir))
            }
    }
}

然后,在我使用这个插件的项目的 build.gradle 中,我添加了

android {
    sourceSets {
        main {
            java.srcDirs += ['build/generated/source/myplugin']
            kotlin.srcDirs += ['build/generated/source/myplugin']
        }
    }
}

我的插件实际上是生成源码到目录的:

build/generated/source/myplugin/com/mygroup/myartifact

无论如何,代码生成正确,并放置在正确的位置,但我无法让编译器识别我生成的代码。任何帮助将不胜感激。

【问题讨论】:

    标签: java android kotlin code-generation gradle-plugin


    【解决方案1】:

    我重构了代码并实现了这里描述的策略:

    我的新代码如下所示:

    project.afterEvaluate {
            val appExtension = project.extensions.findByType(AppExtension::class.java)
            appExtension?.applicationVariants?.all { variant ->
    
                val processResourcesTask = project.tasks.getByName("process${variant.name.capitalize()}Resources")
                val myTask = it.task("my${variant.name.capitalize()}ResourceTask") {
                    it.doLast {
                        doSomeStuff(project, extension, variant.name.capitalize())
                    }
                }.dependsOn(processResourcesTask)
    
                val outputDir = "${project.buildDir}/generated/source/myplugin/${variant.name}"
                variant.registerJavaGeneratingTask(myTask, File(outputDir))
                val kotlinCompileTask = it.tasks.findByName("compile${variant.name.capitalize()}Kotlin") as? SourceTask
                if (kotlinCompileTask != null) {
                    kotlinCompileTask.dependsOn(myTask)
                    val srcSet = it.objects.sourceDirectorySet("myplugin", "myplugin").srcDir(outputDir)
                    kotlinCompileTask.source(srcSet)
                }
            }
        }
    

    我还从客户端 build.gradle 文件中删除了 sourceSets 定义,并且 现在一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 2015-12-13
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多