Skip to content

Commit 1bcf07c

Browse files
committed
Apply ShadowApplicationPlugin for KMP
1 parent 353aa3d commit 1bcf07c

File tree

2 files changed

+42
-11
lines changed

2 files changed

+42
-11
lines changed

src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import org.gradle.api.tasks.TaskContainer
1818
import org.gradle.api.tasks.TaskProvider
1919
import org.gradle.api.tasks.application.CreateStartScripts
2020
import org.gradle.jvm.application.scripts.TemplateBasedScriptGenerator
21+
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
2122

2223
/**
2324
* A [Plugin] which packages and runs a project as a Java Application using the shadowed jar.
@@ -34,7 +35,6 @@ public abstract class ShadowApplicationPlugin : Plugin<Project> {
3435
}
3536

3637
protected open fun Project.addRunTask() {
37-
val extension = applicationExtension
3838
tasks.register(SHADOW_RUN_TASK_NAME, JavaExec::class.java) { task ->
3939
task.description = "Runs this project as a JVM application using the shadow jar"
4040
task.group = ApplicationPlugin.APPLICATION_GROUP
@@ -43,17 +43,28 @@ public abstract class ShadowApplicationPlugin : Plugin<Project> {
4343
i.destinationDir.resolve("lib/${s.archiveFile.get().asFile.name}")
4444
}
4545
task.classpath(jarFile)
46-
task.mainModule.set(extension.mainModule)
47-
task.mainClass.set(extension.mainClass)
48-
task.jvmArguments.convention(provider { extension.applicationDefaultJvmArgs })
46+
47+
if (isKmpApplied) {
48+
extensions.getByType(KotlinMultiplatformExtension::class.java).jvm().binaries {
49+
executable {
50+
task.mainModule.set(mainModule)
51+
task.mainClass.set(mainClass)
52+
task.jvmArguments.convention(applicationDefaultJvmArgs)
53+
}
54+
}
55+
} else {
56+
val extension = applicationExtension
57+
task.mainModule.set(extension.mainModule)
58+
task.mainClass.set(extension.mainClass)
59+
task.jvmArguments.convention(provider { extension.applicationDefaultJvmArgs })
60+
}
4961

5062
task.modularity.inferModulePath.convention(javaPluginExtension.modularity.inferModulePath)
5163
task.javaLauncher.convention(javaToolchainService.launcherFor(javaPluginExtension.toolchain))
5264
}
5365
}
5466

5567
protected open fun Project.addCreateScriptsTask() {
56-
val extension = applicationExtension
5768
tasks.register(SHADOW_SCRIPTS_TASK_NAME, CreateStartScripts::class.java) { task ->
5869
task.description = "Creates OS specific scripts to run the project as a JVM application using the shadow jar"
5970
task.group = ApplicationPlugin.APPLICATION_GROUP
@@ -65,12 +76,27 @@ public abstract class ShadowApplicationPlugin : Plugin<Project> {
6576
resources.text.fromString(requireResourceAsText("$dir/windowsStartScript.txt"))
6677

6778
task.classpath = files(tasks.shadowJar)
68-
task.mainModule.set(extension.mainModule)
69-
task.mainClass.set(extension.mainClass)
70-
task.conventionMapping.map("applicationName", extension::getApplicationName)
71-
task.conventionMapping.map("outputDir") { layout.buildDirectory.dir("scriptsShadow").get().asFile }
72-
task.conventionMapping.map("executableDir", extension::getExecutableDir)
73-
task.conventionMapping.map("defaultJvmOpts", extension::getApplicationDefaultJvmArgs)
79+
80+
if (isKmpApplied) {
81+
extensions.getByType(KotlinMultiplatformExtension::class.java).jvm().binaries {
82+
executable {
83+
task.mainModule.set(mainModule)
84+
task.mainClass.set(mainClass)
85+
task.conventionMapping.map("applicationName", ::applicationName)
86+
task.conventionMapping.map("executableDir", ::executableDir)
87+
task.conventionMapping.map("defaultJvmOpts", ::applicationDefaultJvmArgs)
88+
}
89+
}
90+
} else {
91+
val extension = applicationExtension
92+
task.mainModule.set(extension.mainModule)
93+
task.mainClass.set(extension.mainClass)
94+
task.conventionMapping.map("applicationName", extension::getApplicationName)
95+
task.conventionMapping.map("outputDir") { layout.buildDirectory.dir("scriptsShadow").get().asFile }
96+
task.conventionMapping.map("executableDir", extension::getExecutableDir)
97+
task.conventionMapping.map("defaultJvmOpts", extension::getApplicationDefaultJvmArgs)
98+
}
99+
74100
task.modularity.inferModulePath.convention(javaPluginExtension.modularity.inferModulePath)
75101
}
76102
}

src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowPlugin.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ public abstract class ShadowPlugin : Plugin<Project> {
2020
apply(ShadowApplicationPlugin::class.java)
2121
}
2222
withId("org.jetbrains.kotlin.multiplatform") {
23+
isKmpApplied = true
2324
apply(ShadowKmpPlugin::class.java)
25+
apply(ShadowApplicationPlugin::class.java)
2426
}
2527

2628
// Apply the legacy plugin last.
@@ -32,3 +34,6 @@ public abstract class ShadowPlugin : Plugin<Project> {
3234
}
3335
}
3436
}
37+
38+
internal var isKmpApplied: Boolean = false
39+
private set

0 commit comments

Comments
 (0)