gradle init --type kotlin-library --dsl kotlin可直接创建Kotlin DSL项目,自动生成build.gradle.kts、标准目录结构及kotlin-jvm插件配置,无需手动编写脚本或指定版本。

直接用 gradle init 就能创建出可立即编译运行的 Kotlin JVM 项目,不需要手动写 build.gradle 或配置插件版本——但默认生成的脚本是 Groovy 的,想用 Kotlin DSL 得额外指定或手动转换。
用 gradle init 创建基础 Kotlin JVM 项目
在空目录下执行:
gradle init --type kotlin-library
它会生成一个带 src/main/kotlin 和 src/test/kotlin 的结构,并自动启用 org.jetbrains.kotlin.jvm 插件、添加 kotlin-stdlib 依赖、设置 jvmTarget。关键点:
-
--type kotlin-library是最稳妥的选择;--type kotlin-application也可用,但会多加application插件和main入口,适合需要打包成 jar 运行的场景 - 生成的
build.gradle默认是 Groovy 格式;若想一步生成 Kotlin DSL(即build.gradle.kts),得加--dsl kotlin参数,但要注意 Gradle 7.0+ 才稳定支持 - 生成过程会提示选择 Kotlin 版本,建议选最新稳定版(如
1.9.20),避免与kotlin-stdlib版本不一致导致NoClassDefFoundError
为什么 sourceSets 不用手动配
Gradle 6.0+ 对 Kotlin JVM 项目做了开箱即用的源码路径约定:src/main/kotlin 和 src/test/kotlin 会被自动识别为 Kotlin 源集,无需在 sourceSets 里显式声明 kotlin.srcDirs。但如果你混用 Java 和 Kotlin,或者把 Kotlin 文件放在非标准路径(比如 src/main/java),就必须手动配置,否则 javac 会跳过 Kotlin 文件,kotlinc 也看不到 Java 类。
- 只用 Kotlin?不用动
sourceSets - Java + Kotlin 混合?必须加
sourceSets.main.java.srcDirs = ["src/main/java"]和sourceSets.main.kotlin.srcDirs = ["src/main/kotlin"] - IDE(如 IntelliJ)有时会缓存旧路径,改完后要 reload project,否则代码补全可能失效
kotlinOptions.jvmTarget 必须和 compileOptions 对齐
哪怕只写 Kotlin,也要检查这两处是否一致,否则编译通过、运行时报 IncompatibleClassChangeError 或 UnsupportedClassVersionError:
-
kotlinOptions { jvmTarget = "11" }(Kotlin 编译目标字节码版本) -
compileOptions { sourceCompatibility = JavaVersion.VERSION_11; targetCompatibility = JavaVersion.VERSION_11 }(Java 编译目标) - 如果项目用了 Spring Boot 等框架,还得看其最低要求:Spring Boot 3.x 要求
jvmTarget = "17",硬设成 "11" 会导致运行时找不到java.lang.Record等类
运行 Kotlin 主函数的坑:mainClassName 不是类名
Kotlin 文件里的顶层 fun main() 编译后对应的是 FileNameKt.class,不是 FileName.class。所以用 application 插件时,mainClass.set("AppKt") 才对,写成 "App" 会报 Could not find or load main class App。
- 确认方式:运行
./gradlew classes后,在build/classes/kotlin/main/下看生成的 class 文件名 - 如果用的是
fun main(args: Array<string>)</string>且文件叫App.kt,主类就是AppKt - IntelliJ 运行配置默认能识别,但命令行或 CI 中必须显式写对,否则构建产物无法启动
最易被忽略的是 jvmTarget 和框架基线的匹配,以及 mainClassName 的 Kt 后缀——这两个点不检查,项目看起来能编译,一运行就断在最前端。


















