@@ -4,9 +4,11 @@ import org.gradle.api.plugins.JavaPlugin.API_ELEMENTS_CONFIGURATION_NAME
44import org.gradle.api.plugins.JavaPlugin.JAVADOC_ELEMENTS_CONFIGURATION_NAME
55import org.gradle.api.plugins.JavaPlugin.RUNTIME_ELEMENTS_CONFIGURATION_NAME
66import org.gradle.api.plugins.JavaPlugin.SOURCES_ELEMENTS_CONFIGURATION_NAME
7+ import org.gradle.language.base.plugins.LifecycleBasePlugin.VERIFICATION_GROUP
78import org.gradle.plugin.compatibility.compatibility
89import org.jetbrains.kotlin.gradle.dsl.JvmDefaultMode
910import org.jetbrains.kotlin.gradle.dsl.JvmTarget
11+ import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions
1012import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
1113import org.jetbrains.kotlin.gradle.dsl.abi.ExperimentalAbiValidation
1214
@@ -46,6 +48,8 @@ kotlin {
4648 }
4749}
4850
51+ addMultiReleaseSourceSet(24 )
52+
4953lint {
5054 baseline = file(" gradle/lint-baseline.xml" )
5155 ignoreTestFixturesSources = true
@@ -240,6 +244,10 @@ buildConfig {
240244 }
241245}
242246
247+ tasks.jar {
248+ manifest.attributes(" Multi-Release" to true )
249+ }
250+
243251tasks.pluginUnderTestMetadata { pluginClasspath.from(testPluginClasspath) }
244252
245253tasks.check { dependsOn(tasks.withType<Test >()) }
@@ -254,3 +262,35 @@ tasks.clean {
254262 rootDir.resolve(" site" ),
255263 )
256264}
265+
266+ fun addMultiReleaseSourceSet (version : Int ) {
267+ kotlin.target.compilations.create(" java${version} " ) {
268+ associateWith(kotlin.target.compilations.getByName(" main" ))
269+ compileTaskProvider {
270+ compilerOptions {
271+ this @compilerOptions as KotlinJvmCompilerOptions
272+ jvmTarget = JvmTarget .fromTarget(version.toString())
273+ freeCompilerArgs.add(" -Xjdk-release=$version " )
274+ }
275+ }
276+ compileJavaTaskProvider { options.release = version }
277+
278+ tasks.jar { from(output.allOutputs) { into(" META-INF/versions/$version " ) } }
279+
280+ val versionedTest =
281+ tasks.register(" testJava${version} " , Test ::class ) {
282+ useJUnitPlatform()
283+ group = VERIFICATION_GROUP
284+ description = " Runs test suite using Java $version toolchain."
285+ val testSourceSet = sourceSets.test.get()
286+ testClassesDirs = testSourceSet.output.classesDirs
287+ val testCpWithoutMainOutput = testSourceSet.runtimeClasspath - sourceSets.main.get().output
288+ // Prefer MR classes on the classpath, so remove main output.
289+ classpath = files(tasks.jar.flatMap { it.archiveFile }) + testCpWithoutMainOutput
290+ javaLauncher = javaToolchains.launcherFor {
291+ languageVersion = JavaLanguageVersion .of(version)
292+ }
293+ }
294+ tasks.check { dependsOn(versionedTest) }
295+ }
296+ }
0 commit comments