Gradle Kotlin DSL中Java与Kotlin混编的sourceSets配置问题
解决Java与Kotlin混编Spring Boot项目Gradle编译问题
针对你遇到的compileJava任务无法找到Kotlin代码的问题,在Gradle 8.7 Kotlin DSL中可以通过调整编译任务依赖和输出目录配置来解决,具体步骤如下:
1. 确保插件正确配置
首先确认build.gradle.kts中已正确应用Spring Boot和Kotlin插件,版本保持兼容(比如Spring Boot 3.2.x对应Kotlin 1.9.x):
plugins { id("org.springframework.boot") version "3.2.5" id("io.spring.dependency-management") version "1.1.4" kotlin("jvm") version "1.9.24" kotlin("plugin.spring") version "1.9.24" }
2. 明确SourceSets配置(可选但推荐)
虽然Gradle默认已识别src/main/java和src/main/kotlin,但显式配置可避免歧义:
sourceSets { main { java.srcDir("src/main/java") kotlin.srcDir("src/main/kotlin") } test { java.srcDir("src/test/java") kotlin.srcDir("src/test/kotlin") } }
3. 调整编译任务依赖与输出目录
核心是确保Kotlin代码先编译,且Java编译任务能访问Kotlin的编译输出,Gradle 8+已弃用destinationDir,需使用destinationDirectory.set():
tasks { // 让Java编译任务依赖Kotlin编译任务,保证Kotlin先编译完成 compileJava { dependsOn(compileKotlin) // 将Kotlin编译输出目录加入Java编译的类路径 classpath += files(compileKotlin.get().destinationDirectory) } // 配置Kotlin编译输出目录(Gradle 8+ 标准写法) compileKotlin { destinationDirectory.set(layout.buildDirectory.dir("classes/kotlin/main")) } // 配置Java编译输出目录(保持默认路径即可,也可自定义) compileJava { destinationDirectory.set(layout.buildDirectory.dir("classes/java/main")) } // 测试代码混编的话,同步配置测试编译任务 compileTestJava { dependsOn(compileTestKotlin) classpath += files(compileTestKotlin.get().destinationDirectory) } }
4. 验证编译
执行以下命令清理并重新构建项目:
./gradlew clean build
配置说明
dependsOn(compileKotlin):强制compileJava在compileKotlin完成后执行,确保Java编译时能找到Kotlin生成的class文件。destinationDirectory.set():替代旧版destinationDir的API,符合Gradle 8+ Kotlin DSL的规范。- 向
compileJava的classpath添加Kotlin编译输出:确保Java编译器能扫描到Kotlin的类定义。
内容的提问来源于stack exchange,提问作者Raymond Chenon
相关产品推荐
相关产品推荐

