11package com.github.jengelman.gradle.plugins.shadow
22
33import com.github.jengelman.gradle.plugins.shadow.ShadowApplicationPlugin.Companion.registerRunShadowCommon
4+ import com.github.jengelman.gradle.plugins.shadow.ShadowApplicationPlugin.Companion.registerStartShadowScriptsCommon
45import com.github.jengelman.gradle.plugins.shadow.internal.isAtLeastKgpVersion
56import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar.Companion.SHADOW_JAR_TASK_NAME
67import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar.Companion.registerShadowJarCommon
8+ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar.Companion.shadowJar
9+ import java.util.Locale
710import org.gradle.api.Plugin
811import org.gradle.api.Project
912import org.gradle.api.tasks.JavaExec
13+ import org.gradle.api.tasks.application.CreateStartScripts
1014import org.gradle.api.tasks.bundling.Jar
1115import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
1216import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
@@ -15,6 +19,8 @@ import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
1519public abstract class ShadowKmpPlugin : Plugin <Project > {
1620
1721 override fun apply (project : Project ): Unit = with (project) {
22+ var jvmTarget: KotlinJvmTarget ? = null
23+
1824 extensions.getByType(KotlinMultiplatformExtension ::class .java).targets.configureEach { target ->
1925 if (target !is KotlinJvmTarget ) return @configureEach
2026 @Suppress(" EagerGradleConfiguration" )
@@ -25,14 +31,24 @@ public abstract class ShadowKmpPlugin : Plugin<Project> {
2531 }
2632
2733 configureShadowJar(target)
34+ jvmTarget = target
2835 }
2936
3037 // TODO: https://youtrack.jetbrains.com/issue/KT-77499
3138 afterEvaluate {
3239 if (! isAtLeastKgpVersion(2 , 1 , 20 )) return @afterEvaluate
40+ jvmTarget ? : return @afterEvaluate
41+ val targetNameCap = jvmTarget.targetName.replaceFirstChar { it.titlecase(Locale .US ) }
42+
43+ @Suppress(" EagerGradleConfiguration" ) // TODO: https://issuetracker.google.com/issues/444825893
44+ (tasks.findByName(" run$targetNameCap " ) as ? JavaExec )?.let {
45+ addRunTask(it)
46+ } ? : return @afterEvaluate
47+ // This task must exist if the runJvmTask exists.
3348 @Suppress(" EagerGradleConfiguration" ) // TODO: https://issuetracker.google.com/issues/444825893
34- val runJvmTask = tasks.findByName(" runJvm" ) as ? JavaExec ? : return @afterEvaluate
35- addRunTask(runJvmTask)
49+ (tasks.getByName(" startScriptsFor$targetNameCap " ) as CreateStartScripts ).let {
50+ addCreateScriptsTask(it)
51+ }
3652 }
3753 }
3854
@@ -56,6 +72,9 @@ public abstract class ShadowKmpPlugin : Plugin<Project> {
5672 }
5773
5874 private fun Project.addRunTask (runJvmTask : JavaExec ) {
75+ tasks.shadowJar.configure { task ->
76+ task.mainClass.convention(runJvmTask.mainClass)
77+ }
5978 registerRunShadowCommon { task ->
6079 with (runJvmTask) {
6180 task.mainModule.convention(mainModule)
@@ -66,4 +85,18 @@ public abstract class ShadowKmpPlugin : Plugin<Project> {
6685 }
6786 }
6887 }
88+
89+ private fun Project.addCreateScriptsTask (startScriptsTask : CreateStartScripts ) {
90+ registerStartShadowScriptsCommon { task ->
91+ @Suppress(" InternalGradleApiUsage" , " DuplicatedCode" ) // Usages of conventionMapping.
92+ with (startScriptsTask) {
93+ task.mainModule.convention(mainModule)
94+ task.mainClass.convention(mainClass)
95+ task.conventionMapping.map(" applicationName" , ::getApplicationName)
96+ task.conventionMapping.map(" outputDir" ) { layout.buildDirectory.dir(" scriptsShadow" ).get().asFile }
97+ task.conventionMapping.map(" executableDir" , ::getExecutableDir)
98+ task.conventionMapping.map(" defaultJvmOpts" , ::getDefaultJvmOpts)
99+ }
100+ }
101+ }
69102}
0 commit comments