Skip to content

Commit 271ccdb

Browse files
committed
Explicit ShadowKmpAppPlugin
1 parent 2da7c75 commit 271ccdb

File tree

6 files changed

+167
-70
lines changed

6 files changed

+167
-70
lines changed

api/shadow.api

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,3 @@
1-
public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin : org/gradle/api/Plugin {
2-
public static final field Companion Lcom/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin$Companion;
3-
public static final field SHADOW_INSTALL_TASK_NAME Ljava/lang/String;
4-
public static final field SHADOW_RUN_TASK_NAME Ljava/lang/String;
5-
public static final field SHADOW_SCRIPTS_TASK_NAME Ljava/lang/String;
6-
public fun <init> ()V
7-
protected fun addCreateScriptsTask (Lorg/gradle/api/Project;)V
8-
protected fun addRunTask (Lorg/gradle/api/Project;)V
9-
public synthetic fun apply (Ljava/lang/Object;)V
10-
public fun apply (Lorg/gradle/api/Project;)V
11-
protected fun configureDistribution (Lorg/gradle/api/Project;)V
12-
protected fun configureInstallTask (Lorg/gradle/api/Project;)V
13-
protected fun configureShadowJarMainClass (Lorg/gradle/api/Project;)V
14-
}
15-
16-
public final class com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin$Companion {
17-
public final fun getInstallShadowDist (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider;
18-
public final fun getStartShadowScripts (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider;
19-
}
20-
211
public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin : org/gradle/api/Plugin {
222
public static final field COMPONENT_NAME Ljava/lang/String;
233
public static final field CONFIGURATION_NAME Ljava/lang/String;
@@ -40,6 +20,26 @@ public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowExtension
4020
public final fun component (Lorg/gradle/api/publish/maven/MavenPublication;)V
4121
}
4222

23+
public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowJavaAppPlugin : org/gradle/api/Plugin {
24+
public static final field Companion Lcom/github/jengelman/gradle/plugins/shadow/ShadowJavaAppPlugin$Companion;
25+
public static final field SHADOW_INSTALL_TASK_NAME Ljava/lang/String;
26+
public static final field SHADOW_RUN_TASK_NAME Ljava/lang/String;
27+
public static final field SHADOW_SCRIPTS_TASK_NAME Ljava/lang/String;
28+
public fun <init> ()V
29+
protected fun addCreateScriptsTask (Lorg/gradle/api/Project;)V
30+
protected fun addRunTask (Lorg/gradle/api/Project;)V
31+
public synthetic fun apply (Ljava/lang/Object;)V
32+
public fun apply (Lorg/gradle/api/Project;)V
33+
protected fun configureDistribution (Lorg/gradle/api/Project;)V
34+
protected fun configureInstallTask (Lorg/gradle/api/Project;)V
35+
protected fun configureShadowJarMainClass (Lorg/gradle/api/Project;)V
36+
}
37+
38+
public final class com/github/jengelman/gradle/plugins/shadow/ShadowJavaAppPlugin$Companion {
39+
public final fun getInstallShadowDist (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider;
40+
public final fun getStartShadowScripts (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider;
41+
}
42+
4343
public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin : org/gradle/api/Plugin {
4444
public static final field Companion Lcom/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin$Companion;
4545
public static final field SHADOW_JAR_TASK_NAME Ljava/lang/String;
@@ -60,6 +60,24 @@ public final class com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin$C
6060
public final fun registerShadowJarCommon (Lorg/gradle/api/Project;Lorg/gradle/api/Action;)Lorg/gradle/api/tasks/TaskProvider;
6161
}
6262

63+
public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowKmpAppPlugin : org/gradle/api/Plugin {
64+
public static final field Companion Lcom/github/jengelman/gradle/plugins/shadow/ShadowKmpAppPlugin$Companion;
65+
public static final field SHADOW_INSTALL_TASK_NAME Ljava/lang/String;
66+
public static final field SHADOW_RUN_TASK_NAME Ljava/lang/String;
67+
public static final field SHADOW_SCRIPTS_TASK_NAME Ljava/lang/String;
68+
public fun <init> ()V
69+
protected fun addCreateScriptsTask (Lorg/gradle/api/Project;)V
70+
protected fun addRunTask (Lorg/gradle/api/Project;)V
71+
public synthetic fun apply (Ljava/lang/Object;)V
72+
public fun apply (Lorg/gradle/api/Project;)V
73+
protected fun configureDistribution (Lorg/gradle/api/Project;)V
74+
}
75+
76+
public final class com/github/jengelman/gradle/plugins/shadow/ShadowKmpAppPlugin$Companion {
77+
public final fun getInstallShadowDist (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider;
78+
public final fun getStartShadowScripts (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider;
79+
}
80+
6381
public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowKmpPlugin : org/gradle/api/Plugin {
6482
public fun <init> ()V
6583
public synthetic fun apply (Ljava/lang/Object;)V

src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/ApplicationPluginTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import assertk.assertions.contains
66
import assertk.assertions.containsOnly
77
import assertk.assertions.doesNotContain
88
import assertk.assertions.isEqualTo
9-
import com.github.jengelman.gradle.plugins.shadow.ShadowJavaAppPlugin.Companion.SHADOW_INSTALL_TASK_NAME
109
import com.github.jengelman.gradle.plugins.shadow.ShadowBasePlugin.Companion.DISTRIBUTION_NAME
10+
import com.github.jengelman.gradle.plugins.shadow.ShadowJavaAppPlugin.Companion.SHADOW_INSTALL_TASK_NAME
1111
import com.github.jengelman.gradle.plugins.shadow.internal.classPathAttributeKey
1212
import com.github.jengelman.gradle.plugins.shadow.internal.mainClassAttributeKey
1313
import com.github.jengelman.gradle.plugins.shadow.util.Issue

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

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ 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
2221

2322
/**
2423
* A [Plugin] which packages and runs a project as a Java Application using the shadowed jar.
@@ -44,20 +43,10 @@ public abstract class ShadowJavaAppPlugin : Plugin<Project> {
4443
}
4544
task.classpath(jarFile)
4645

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-
with(applicationExtension) {
57-
task.mainModule.set(mainModule)
58-
task.mainClass.set(mainClass)
59-
task.jvmArguments.convention(provider { applicationDefaultJvmArgs })
60-
}
46+
with(applicationExtension) {
47+
task.mainModule.set(mainModule)
48+
task.mainClass.set(mainClass)
49+
task.jvmArguments.convention(provider { applicationDefaultJvmArgs })
6150
}
6251

6352
task.modularity.inferModulePath.convention(javaPluginExtension.modularity.inferModulePath)
@@ -78,25 +67,13 @@ public abstract class ShadowJavaAppPlugin : Plugin<Project> {
7867

7968
task.classpath = files(tasks.shadowJar)
8069

81-
if (isKmpApplied) {
82-
extensions.getByType(KotlinMultiplatformExtension::class.java).jvm().binaries {
83-
executable {
84-
task.mainModule.set(mainModule)
85-
task.mainClass.set(mainClass)
86-
task.conventionMapping.map("applicationName", ::applicationName)
87-
task.conventionMapping.map("executableDir", ::executableDir)
88-
task.conventionMapping.map("defaultJvmOpts", ::applicationDefaultJvmArgs)
89-
}
90-
}
91-
} else {
92-
with(applicationExtension) {
93-
task.mainModule.set(mainModule)
94-
task.mainClass.set(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", ::getApplicationDefaultJvmArgs)
99-
}
70+
with(applicationExtension) {
71+
task.mainModule.set(mainModule)
72+
task.mainClass.set(mainClass)
73+
task.conventionMapping.map("applicationName", ::getApplicationName)
74+
task.conventionMapping.map("outputDir") { layout.buildDirectory.dir("scriptsShadow").get().asFile }
75+
task.conventionMapping.map("executableDir", ::getExecutableDir)
76+
task.conventionMapping.map("defaultJvmOpts", ::getApplicationDefaultJvmArgs)
10077
}
10178

10279
task.modularity.inferModulePath.convention(javaPluginExtension.modularity.inferModulePath)
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package com.github.jengelman.gradle.plugins.shadow
2+
3+
import com.github.jengelman.gradle.plugins.shadow.ShadowBasePlugin.Companion.shadow
4+
import com.github.jengelman.gradle.plugins.shadow.ShadowJavaPlugin.Companion.shadowJar
5+
import com.github.jengelman.gradle.plugins.shadow.internal.applicationExtension
6+
import com.github.jengelman.gradle.plugins.shadow.internal.distributions
7+
import com.github.jengelman.gradle.plugins.shadow.internal.javaPluginExtension
8+
import com.github.jengelman.gradle.plugins.shadow.internal.javaToolchainService
9+
import com.github.jengelman.gradle.plugins.shadow.internal.requireResourceAsText
10+
import kotlin.io.path.Path
11+
import org.gradle.api.Plugin
12+
import org.gradle.api.Project
13+
import org.gradle.api.plugins.ApplicationPlugin
14+
import org.gradle.api.tasks.JavaExec
15+
import org.gradle.api.tasks.Sync
16+
import org.gradle.api.tasks.TaskContainer
17+
import org.gradle.api.tasks.TaskProvider
18+
import org.gradle.api.tasks.application.CreateStartScripts
19+
import org.gradle.jvm.application.scripts.TemplateBasedScriptGenerator
20+
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
21+
22+
/**
23+
* A [Plugin] which packages and runs a project as a Java Application using the shadowed jar.
24+
*
25+
* Modified from [org.gradle.api.plugins.ApplicationPlugin.java](https://github.com/gradle/gradle/blob/45a20d82b623786d19b50185e595adf3d7b196b2/platforms/jvm/plugins-application/src/main/java/org/gradle/api/plugins/ApplicationPlugin.java).
26+
*/
27+
public abstract class ShadowKmpAppPlugin : Plugin<Project> {
28+
override fun apply(project: Project) {
29+
project.addRunTask()
30+
project.addCreateScriptsTask()
31+
// project.configureDistribution()
32+
}
33+
34+
protected open fun Project.addRunTask() {
35+
tasks.register(SHADOW_RUN_TASK_NAME, JavaExec::class.java) { task ->
36+
task.description = "Runs this project as a JVM application using the shadow jar"
37+
task.group = ApplicationPlugin.APPLICATION_GROUP
38+
39+
extensions.getByType(KotlinMultiplatformExtension::class.java).jvm().binaries {
40+
executable {
41+
task.mainModule.set(mainModule)
42+
task.mainClass.set(mainClass)
43+
task.jvmArguments.convention(applicationDefaultJvmArgs)
44+
val jarFile = executableDir.zip(tasks.shadowJar) { e, s ->
45+
Path(e).resolveSibling("lib/${s.archiveFile.get().asFile.name}")
46+
}
47+
task.classpath(jarFile)
48+
}
49+
}
50+
51+
task.modularity.inferModulePath.convention(javaPluginExtension.modularity.inferModulePath)
52+
task.javaLauncher.convention(javaToolchainService.launcherFor(javaPluginExtension.toolchain))
53+
}
54+
}
55+
56+
protected open fun Project.addCreateScriptsTask() {
57+
tasks.register(SHADOW_SCRIPTS_TASK_NAME, CreateStartScripts::class.java) { task ->
58+
task.description = "Creates OS specific scripts to run the project as a JVM application using the shadow jar"
59+
task.group = ApplicationPlugin.APPLICATION_GROUP
60+
61+
val dir = "com/github/jengelman/gradle/plugins/shadow/internal"
62+
(task.unixStartScriptGenerator as TemplateBasedScriptGenerator).template =
63+
resources.text.fromString(requireResourceAsText("$dir/unixStartScript.txt"))
64+
(task.windowsStartScriptGenerator as TemplateBasedScriptGenerator).template =
65+
resources.text.fromString(requireResourceAsText("$dir/windowsStartScript.txt"))
66+
67+
task.classpath = files(tasks.shadowJar)
68+
69+
extensions.getByType(KotlinMultiplatformExtension::class.java).jvm().binaries {
70+
executable {
71+
task.mainModule.set(mainModule)
72+
task.mainClass.set(mainClass)
73+
task.conventionMapping.map("applicationName", ::applicationName)
74+
task.conventionMapping.map("executableDir", ::executableDir)
75+
task.conventionMapping.map("defaultJvmOpts", ::applicationDefaultJvmArgs)
76+
}
77+
}
78+
79+
task.modularity.inferModulePath.convention(javaPluginExtension.modularity.inferModulePath)
80+
}
81+
}
82+
83+
protected open fun Project.configureDistribution() {
84+
distributions.register(ShadowBasePlugin.DISTRIBUTION_NAME) { distributions ->
85+
distributions.contents { distSpec ->
86+
distSpec.from(file("src/dist"))
87+
distSpec.into("lib") { lib ->
88+
lib.from(tasks.shadowJar)
89+
lib.from(configurations.shadow)
90+
}
91+
distSpec.into("bin") { bin ->
92+
bin.from(tasks.startShadowScripts)
93+
bin.filePermissions { it.unix(UNIX_SCRIPT_PERMISSIONS) }
94+
}
95+
distSpec.with(applicationExtension.applicationDistribution)
96+
}
97+
}
98+
}
99+
100+
public companion object {
101+
/**
102+
* Reflects the number of 755.
103+
*/
104+
private const val UNIX_SCRIPT_PERMISSIONS = "rwxr-xr-x"
105+
106+
public const val SHADOW_RUN_TASK_NAME: String = "runShadow"
107+
public const val SHADOW_SCRIPTS_TASK_NAME: String = "startShadowScripts"
108+
public const val SHADOW_INSTALL_TASK_NAME: String = "installShadowDist"
109+
110+
public inline val TaskContainer.startShadowScripts: TaskProvider<CreateStartScripts>
111+
get() = named(SHADOW_SCRIPTS_TASK_NAME, CreateStartScripts::class.java)
112+
113+
public inline val TaskContainer.installShadowDist: TaskProvider<Sync>
114+
get() = named(SHADOW_INSTALL_TASK_NAME, Sync::class.java)
115+
}
116+
}

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,6 @@ public abstract class ShadowKmpPlugin : Plugin<Project> {
1818
listOf(configurations.getByName(kotlinJvmMain.get().runtimeDependencyConfigurationName))
1919
},
2020
)
21-
kmpExtension.jvm().binaries {
22-
executable {
23-
mainClass
24-
mainModule
25-
applicationName
26-
applicationDefaultJvmArgs
27-
executableDir
28-
applicationDistribution
29-
}
30-
}
3121
}
3222
}
3323
}

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ public abstract class ShadowPlugin : Plugin<Project> {
2020
apply(ShadowJavaAppPlugin::class.java)
2121
}
2222
withId("org.jetbrains.kotlin.multiplatform") {
23-
isKmpApplied = true
2423
apply(ShadowKmpPlugin::class.java)
25-
apply(ShadowJavaAppPlugin::class.java)
24+
apply(ShadowKmpAppPlugin::class.java)
2625
}
2726

2827
// Apply the legacy plugin last.
@@ -34,6 +33,3 @@ public abstract class ShadowPlugin : Plugin<Project> {
3433
}
3534
}
3635
}
37-
38-
internal var isKmpApplied: Boolean = false
39-
private set

0 commit comments

Comments
 (0)