如何创建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.
相关产品推荐
相关产品推荐

