Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
kotlin编译器找不到生成的java源代码_Java_Android_Kotlin_Code Generation_Gradle Plugin - Fatal编程技术网

kotlin编译器找不到生成的java源代码

kotlin编译器找不到生成的java源代码,java,android,kotlin,code-generation,gradle-plugin,Java,Android,Kotlin,Code Generation,Gradle Plugin,我正在编写一个gradle插件来生成Java代码。我的插件生成的代码基于Android R类,因此它依赖于 processVariantResources 任务。在我的插件中,我使用以下代码来实现: class MyPlugin : Plugin<Project> { override fun apply(project: Project) { val extension = project.extensions.create<MyPluginExtension&g

我正在编写一个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/generated/source/myplugin/com/mygroup/myartifact

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

我重构了代码并实现了下面描述的策略:

我的新代码如下所示:

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)
            }
        }
    }
我还从client build.gradle文件中删除了sourceset定义,并且 现在一切正常

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)
            }
        }
    }