1
1
package com.github.jengelman.gradle.plugins.shadow
2
2
3
3
import com.github.jengelman.gradle.plugins.shadow.ShadowApplicationPlugin.Companion.registerRunShadowCommon
4
+ import com.github.jengelman.gradle.plugins.shadow.ShadowApplicationPlugin.Companion.registerStartShadowScriptsCommon
4
5
import com.github.jengelman.gradle.plugins.shadow.internal.isAtLeastKgpVersion
5
6
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar.Companion.SHADOW_JAR_TASK_NAME
6
7
import 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
7
10
import org.gradle.api.Plugin
8
11
import org.gradle.api.Project
9
12
import org.gradle.api.tasks.JavaExec
13
+ import org.gradle.api.tasks.application.CreateStartScripts
10
14
import org.gradle.api.tasks.bundling.Jar
11
15
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
12
16
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
@@ -15,6 +19,8 @@ import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
15
19
public abstract class ShadowKmpPlugin : Plugin <Project > {
16
20
17
21
override fun apply (project : Project ): Unit = with (project) {
22
+ var jvmTarget: KotlinJvmTarget ? = null
23
+
18
24
extensions.getByType(KotlinMultiplatformExtension ::class .java).targets.configureEach { target ->
19
25
if (target !is KotlinJvmTarget ) return @configureEach
20
26
@Suppress(" EagerGradleConfiguration" )
@@ -25,14 +31,24 @@ public abstract class ShadowKmpPlugin : Plugin<Project> {
25
31
}
26
32
27
33
configureShadowJar(target)
34
+ jvmTarget = target
28
35
}
29
36
30
37
// TODO: https://youtrack.jetbrains.com/issue/KT-77499
31
38
afterEvaluate {
32
39
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.
33
48
@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
+ }
36
52
}
37
53
}
38
54
@@ -56,6 +72,9 @@ public abstract class ShadowKmpPlugin : Plugin<Project> {
56
72
}
57
73
58
74
private fun Project.addRunTask (runJvmTask : JavaExec ) {
75
+ tasks.shadowJar.configure { task ->
76
+ task.mainClass.convention(runJvmTask.mainClass)
77
+ }
59
78
registerRunShadowCommon { task ->
60
79
with (runJvmTask) {
61
80
task.mainModule.convention(mainModule)
@@ -66,4 +85,18 @@ public abstract class ShadowKmpPlugin : Plugin<Project> {
66
85
}
67
86
}
68
87
}
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
+ }
69
102
}
0 commit comments