Appearance
编译配置
Java 编译参数
kotlin
tasks.withType<JavaCompile> {
options.apply {
encoding = "UTF-8"
isDeprecation = true // 显示废弃 API 警告
isWarnings = true // 显示警告
isDebug = true // 生成调试信息
compilerArgs.addAll(listOf(
"-Xlint:all", // 所有 Lint 检查
"-Xlint:-processing", // 排除注解处理警告
"-parameters", // 保留方法参数名(Spring 反射需要)
"-Werror" // 警告视为错误
))
// 注解处理器参数
compilerArgs.addAll(listOf(
"-Amapstruct.defaultComponentModel=spring"
))
}
}注解处理器(Annotation Processor)
kotlin
dependencies {
// Lombok
compileOnly("org.projectlombok:lombok:1.18.30")
annotationProcessor("org.projectlombok:lombok:1.18.30")
// MapStruct(需要在 Lombok 后面)
implementation("org.mapstruct:mapstruct:1.5.5.Final")
annotationProcessor("org.mapstruct:mapstruct-processor:1.5.5.Final")
// QueryDSL
annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jpa")
annotationProcessor("jakarta.persistence:jakarta.persistence-api:3.1.0")
}
// 配置注解处理器输出目录
tasks.named<JavaCompile>("compileJava") {
options.annotationProcessorPath = configurations["annotationProcessor"]
options.generatedSourceOutputDirectory.set(
layout.buildDirectory.dir("generated/sources/annotationProcessor/java/main")
)
}
// 将生成的源码加入 sourceSets
sourceSets.main {
java.srcDir(layout.buildDirectory.dir("generated/sources/annotationProcessor/java/main"))
}Java Toolchain(跨 JDK 构建)
Toolchain 允许指定编译时使用的 JDK 版本,即使构建机器上安装的是不同版本:
kotlin
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
vendor.set(JvmVendorSpec.ADOPTIUM) // 指定 JDK 供应商
}
}
// 单独配置某个任务的 JDK
tasks.named<JavaCompile>("compileJava") {
javaCompiler.set(javaToolchains.compilerFor {
languageVersion.set(JavaLanguageVersion.of(21))
})
}bash
# 查看可用的 JDK
./gradlew -q javaToolchainsKotlin 编译配置
kotlin
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions {
jvmTarget = "17"
freeCompilerArgs = listOf(
"-Xjsr305=strict", // 严格 null 检查
"-Xjvm-default=all", // Kotlin 接口默认方法
"-opt-in=kotlin.RequiresOptIn"
)
apiVersion = "1.9"
languageVersion = "1.9"
}
}增量编译
Gradle Java 插件默认开启增量编译(只重新编译变更的文件及其依赖):
kotlin
tasks.withType<JavaCompile> {
options.isIncremental = true // 默认已开启
}