Skip to content

Commit efeef33

Browse files
GooolerCopilot
andcommitted
Prefer Class-File API on Java 24 or above
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
1 parent d062fa2 commit efeef33

4 files changed

Lines changed: 563 additions & 2 deletions

File tree

build.gradle.kts

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ import org.gradle.api.plugins.JavaPlugin.API_ELEMENTS_CONFIGURATION_NAME
44
import org.gradle.api.plugins.JavaPlugin.JAVADOC_ELEMENTS_CONFIGURATION_NAME
55
import org.gradle.api.plugins.JavaPlugin.RUNTIME_ELEMENTS_CONFIGURATION_NAME
66
import org.gradle.api.plugins.JavaPlugin.SOURCES_ELEMENTS_CONFIGURATION_NAME
7+
import org.gradle.language.base.plugins.LifecycleBasePlugin.VERIFICATION_GROUP
78
import org.gradle.plugin.compatibility.compatibility
89
import org.jetbrains.kotlin.gradle.dsl.JvmDefaultMode
910
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
11+
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions
1012
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
13+
import org.jetbrains.kotlin.gradle.dsl.abi.BinariesSource
1114
import org.jetbrains.kotlin.gradle.dsl.abi.ExperimentalAbiValidation
1215

1316
plugins {
@@ -30,7 +33,11 @@ dokka { dokkaPublications.html { outputDirectory = rootDir.resolve("docs/api") }
3033

3134
kotlin {
3235
explicitApi()
33-
@OptIn(ExperimentalAbiValidation::class) abiValidation()
36+
@OptIn(ExperimentalAbiValidation::class)
37+
abiValidation {
38+
// Check APIs under main and versioned source sets.
39+
binariesSource = BinariesSource.NON_TEST_COMPILATIONS
40+
}
3441
val jdkRelease = "17"
3542
compilerOptions {
3643
allWarningsAsErrors = true
@@ -46,6 +53,8 @@ kotlin {
4653
}
4754
}
4855

56+
addMultiReleaseSourceSet(24)
57+
4958
lint {
5059
baseline = file("gradle/lint-baseline.xml")
5160
ignoreTestFixturesSources = true
@@ -240,6 +249,10 @@ buildConfig {
240249
}
241250
}
242251

252+
tasks.jar {
253+
manifest.attributes("Multi-Release" to true)
254+
}
255+
243256
tasks.pluginUnderTestMetadata { pluginClasspath.from(testPluginClasspath) }
244257

245258
tasks.check { dependsOn(tasks.withType<Test>()) }
@@ -254,3 +267,35 @@ tasks.clean {
254267
rootDir.resolve("site"),
255268
)
256269
}
270+
271+
fun addMultiReleaseSourceSet(version: Int) {
272+
kotlin.target.compilations.create("java${version}") {
273+
associateWith(kotlin.target.compilations.getByName("main"))
274+
compileTaskProvider {
275+
compilerOptions {
276+
this@compilerOptions as KotlinJvmCompilerOptions
277+
jvmTarget = JvmTarget.fromTarget(version.toString())
278+
freeCompilerArgs.add("-Xjdk-release=$version")
279+
}
280+
}
281+
compileJavaTaskProvider { options.release = version }
282+
283+
tasks.jar { from(output.allOutputs) { into("META-INF/versions/$version") } }
284+
285+
val versionedTest =
286+
tasks.register("testJava${version}", Test::class) {
287+
useJUnitPlatform()
288+
group = VERIFICATION_GROUP
289+
description = "Runs test suite using Java $version toolchain."
290+
val testSourceSet = sourceSets.test.get()
291+
testClassesDirs = testSourceSet.output.classesDirs
292+
val testCpWithoutMainOutput = testSourceSet.runtimeClasspath - sourceSets.main.get().output
293+
// Prefer MR classes on the classpath, so remove main output.
294+
classpath = files(tasks.jar.flatMap { it.archiveFile }) + testCpWithoutMainOutput
295+
javaLauncher = javaToolchains.launcherFor {
296+
languageVersion = JavaLanguageVersion.of(version)
297+
}
298+
}
299+
tasks.check { dependsOn(versionedTest) }
300+
}
301+
}

gradle.properties

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
# https://kotlinlang.org/docs/gradle-configure-project.html#dependency-on-the-standard-library
33
kotlin.stdlib.default.dependency=false
44

5+
# Keep associated Kotlin compilations from depending on archive tasks (e.g., jar), which can create circular task graphs in multi-release setups.
6+
# https://kotlinlang.org/docs/gradle-configure-project.html#disable-use-of-artifact-in-compilation-task
7+
# https://kotlinlang.org/docs/whatsnew2020.html#added-task-dependency-for-rare-cases-when-the-compile-task-lacks-one-on-an-artifact
8+
kotlin.build.archivesTaskOutputAsFriendModule=false
9+
510
org.gradle.caching=true
611
org.gradle.configuration-cache=true
712
org.gradle.configuration-cache.parallel=true

settings.gradle.kts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ pluginManagement {
1212
}
1313
}
1414

15-
plugins { id("com.gradle.develocity") version "4.5.0" }
15+
plugins {
16+
id("com.gradle.develocity") version "4.5.0"
17+
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
18+
}
1619

1720
develocity {
1821
buildScan {

0 commit comments

Comments
 (0)