You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建KotlinCompile类型Gradle任务?编译自定义Kotlin代码遇阻

解决KotlinCompile任务初始化报错问题

问题原因

直接实例化KotlinCompile任务时,Gradle无法自动注入任务构造所需的KotlinJvmOptions依赖,这是Kotlin Gradle插件的任务初始化规则导致的。

解决方法

方法1:通过Kotlin插件扩展创建任务(推荐)

借助Kotlin插件提供的扩展API创建编译任务,能自动处理KotlinJvmOptions等依赖注入:

自定义插件(Java代码)修改版:

private void createCompileStubsTask(final Project project) {
    KotlinJvmExtension kotlinJvm = project.getExtensions().getByType(KotlinJvmExtension.class);
    KotlinCompile compileKotlin = (KotlinCompile) project.getTasks().findByName("compileKotlin");
    
    // 通过Kotlin扩展创建编译任务
    TaskProvider<KotlinCompile> compileKotlinStubs = kotlinJvm.getTarget().compilations.create("stubs", compilation -> {
        compilation.getDefaultSourceSet().srcDir(project.getLayout().getBuildDirectory().dir(GENERATED_STUB_SOURCES_DIRECTORY));
        // 配置输出目录
        compilation.getOutput().getClassesDir().set(project.getLayout().getBuildDirectory().dir(GENERATED_STUB_CLASSES_DIRECTORY));
        // 复用主编译任务的类路径
        compilation.setCompileClasspath(compileKotlin.getClasspath());
    }).getCompileTaskProvider();
    
    compileKotlin.finalizedBy(compileKotlinStubs);
}

build.gradle(Groovy)修改版:

kotlin {
    target {
        compilations.create('stubs') {
            defaultSourceSet.srcDir(layout.buildDirectory.dir('generated-stub-sources'))
            output.classesDir.set(layout.buildDirectory.dir('generated-stub-classes'))
            compileClasspath = compileKotlin.classpath
        }
    }
}

// 绑定到自动生成的compileStubsKotlin任务
compileKotlin.finalizedBy(tasks.named('compileStubsKotlin'))

方法2:复制已有任务的配置

如果需要直接创建任务,可以复制compileKotlin的配置来确保KotlinJvmOptions正确传递:

task compileStubs(type: org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
    // 复用原任务的Kotlin配置
    kotlinOptions = compileKotlin.kotlinOptions
    classpath = compileKotlin.classpath
    source(layout.buildDirectory.dir('generated-stub-sources'))
    destinationDirectory.set(layout.buildDirectory.dir('generated-stub-classes'))
}

compileKotlin.finalizedBy(compileStubs)

额外注意事项

  • 无需手动调用mkdirs(),Gradle会自动在任务执行前创建输出目录,手动创建可能破坏缓存机制。
  • 确保generated-stub-sources目录下存在有效Kotlin源码,否则任务会因无编译源文件直接跳过。

内容的提问来源于stack exchange,提问作者Lukasz G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:10:31