From 79024b78f3ded304b4d3ec48ef820d012e86d352 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 29 Jan 2025 13:55:35 +0800 Subject: [PATCH 1/6] Add extensions for project ExtensionContainer --- .../plugins/shadow/ShadowApplicationPlugin.kt | 39 ++++++++++--------- .../gradle/plugins/shadow/ShadowJavaPlugin.kt | 9 ++--- .../plugins/shadow/internal/GradleCompat.kt | 20 ++++++++++ .../gradle/plugins/shadow/tasks/ShadowJar.kt | 5 +-- 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt index 9067f65b4..13696e846 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt @@ -1,11 +1,14 @@ package com.github.jengelman.gradle.plugins.shadow +import com.github.jengelman.gradle.plugins.shadow.internal.applicationExtension +import com.github.jengelman.gradle.plugins.shadow.internal.distributions +import com.github.jengelman.gradle.plugins.shadow.internal.javaPluginExtension +import com.github.jengelman.gradle.plugins.shadow.internal.javaToolchainService import com.github.jengelman.gradle.plugins.shadow.internal.requireResourceAsText import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.distribution.DistributionContainer import org.gradle.api.plugins.ApplicationPlugin import org.gradle.api.plugins.JavaApplication import org.gradle.api.plugins.JavaPluginExtension @@ -19,10 +22,14 @@ import org.gradle.jvm.toolchain.JavaToolchainService public abstract class ShadowApplicationPlugin : Plugin { private lateinit var project: Project private lateinit var javaApplication: JavaApplication + private lateinit var javaPluginExtension: JavaPluginExtension + private lateinit var javaToolchainService: JavaToolchainService override fun apply(project: Project) { this.project = project - this.javaApplication = project.extensions.getByType(JavaApplication::class.java) + this.javaApplication = project.applicationExtension + this.javaPluginExtension = project.javaPluginExtension + this.javaToolchainService = project.javaToolchainService addRunTask() addCreateScriptsTask() @@ -56,9 +63,7 @@ public abstract class ShadowApplicationPlugin : Plugin { task.classpath(jarFile) task.mainClass.set(javaApplication.mainClass) task.conventionMapping.map("jvmArgs", javaApplication::getApplicationDefaultJvmArgs) - val toolchain = project.extensions.getByType(JavaPluginExtension::class.java).toolchain - val defaultLauncher = project.extensions.getByType(JavaToolchainService::class.java).launcherFor(toolchain) - task.javaLauncher.set(defaultLauncher) + task.javaLauncher.set(javaToolchainService.launcherFor(javaPluginExtension.toolchain)) } } @@ -86,7 +91,6 @@ public abstract class ShadowApplicationPlugin : Plugin { task.conventionMapping.map("outputDir") { project.layout.buildDirectory.dir("scriptsShadow").get().asFile } task.conventionMapping.map("executableDir", javaApplication::getExecutableDir) task.conventionMapping.map("defaultJvmOpts", javaApplication::getApplicationDefaultJvmArgs) - val javaPluginExtension = project.extensions.getByType(JavaPluginExtension::class.java) task.modularity.inferModulePath.convention(javaPluginExtension.modularity.inferModulePath) } } @@ -121,20 +125,19 @@ public abstract class ShadowApplicationPlugin : Plugin { } protected open fun configureDistSpec() { - project.extensions.getByType(DistributionContainer::class.java) - .register(ShadowBasePlugin.DISTRIBUTION_NAME) { distributions -> - distributions.contents { contents -> - contents.from(project.file("src/dist")) - contents.into("lib") { lib -> - lib.from(shadowJar) - lib.from(project.configurations.named(ShadowBasePlugin.CONFIGURATION_NAME)) - } - contents.into("bin") { bin -> - bin.from(project.tasks.named(SHADOW_SCRIPTS_TASK_NAME)) - bin.filePermissions { it.unix(493) } - } + project.distributions.register(ShadowBasePlugin.DISTRIBUTION_NAME) { distributions -> + distributions.contents { contents -> + contents.from(project.file("src/dist")) + contents.into("lib") { lib -> + lib.from(shadowJar) + lib.from(project.configurations.named(ShadowBasePlugin.CONFIGURATION_NAME)) + } + contents.into("bin") { bin -> + bin.from(project.tasks.named(SHADOW_SCRIPTS_TASK_NAME)) + bin.filePermissions { it.unix(493) } } } + } } protected val shadowJar: TaskProvider diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt index 93e313af0..e5a355581 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt @@ -1,6 +1,8 @@ package com.github.jengelman.gradle.plugins.shadow +import com.github.jengelman.gradle.plugins.shadow.internal.javaPluginExtension import com.github.jengelman.gradle.plugins.shadow.internal.runtimeConfiguration +import com.github.jengelman.gradle.plugins.shadow.internal.sourceSets import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import javax.inject.Inject import org.gradle.api.Plugin @@ -14,8 +16,6 @@ import org.gradle.api.attributes.java.TargetJvmVersion import org.gradle.api.component.AdhocComponentWithVariants import org.gradle.api.component.SoftwareComponentFactory import org.gradle.api.plugins.JavaPlugin -import org.gradle.api.plugins.JavaPluginExtension -import org.gradle.api.tasks.SourceSetContainer import org.gradle.api.tasks.TaskProvider import org.gradle.jvm.tasks.Jar import org.gradle.plugin.devel.plugins.JavaGradlePluginPlugin @@ -45,7 +45,7 @@ public abstract class ShadowJavaPlugin @Inject constructor( ) attr.attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling::class.java, Bundling.SHADOWED)) val targetJvmVersion = project.provider { - project.extensions.getByType(JavaPluginExtension::class.java).targetCompatibility.majorVersion.toInt() + project.javaPluginExtension.targetCompatibility.majorVersion.toInt() } // Track JavaPluginExtension to update targetJvmVersion when it changes. attr.attributeProvider(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, targetJvmVersion) @@ -80,7 +80,6 @@ public abstract class ShadowJavaPlugin @Inject constructor( } private fun configureShadowTask(project: Project, shadowConfiguration: Configuration): TaskProvider { - val sourceSets = project.extensions.getByType(SourceSetContainer::class.java) val jarTask = project.tasks.named(JavaPlugin.JAR_TASK_NAME, Jar::class.java) val taskProvider = project.tasks.register(SHADOW_JAR_TASK_NAME, ShadowJar::class.java) { shadow -> shadow.group = ShadowBasePlugin.GROUP_NAME @@ -96,7 +95,7 @@ public abstract class ShadowJavaPlugin @Inject constructor( shadow.manifest.attributes["Class-Path"] = attrs.joinToString(" ").trim() } } - shadow.from(sourceSets.named("main").map { it.output }) + shadow.from(project.sourceSets.named("main").map { it.output }) shadow.configurations.convention(listOf(project.runtimeConfiguration)) shadow.exclude( "META-INF/INDEX.LIST", diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt index 0061d60e7..3472f5718 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt @@ -3,13 +3,18 @@ package com.github.jengelman.gradle.plugins.shadow.internal import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ProjectDependency +import org.gradle.api.distribution.DistributionContainer import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.model.ObjectFactory +import org.gradle.api.plugins.JavaApplication import org.gradle.api.plugins.JavaPlugin +import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.provider.SetProperty +import org.gradle.api.tasks.SourceSetContainer +import org.gradle.jvm.toolchain.JavaToolchainService import org.gradle.util.GradleVersion /** @@ -21,6 +26,21 @@ internal inline val Project.runtimeConfiguration: Configuration ?: configurations.getByName("runtime") } +internal inline val Project.sourceSets: SourceSetContainer + get() = extensions.getByType(SourceSetContainer::class.java) + +internal inline val Project.distributions: DistributionContainer + get() = extensions.getByType(DistributionContainer::class.java) + +internal inline val Project.applicationExtension: JavaApplication + get() = extensions.getByType(JavaApplication::class.java) + +internal inline val Project.javaPluginExtension: JavaPluginExtension + get() = extensions.getByType(JavaPluginExtension::class.java) + +internal inline val Project.javaToolchainService: JavaToolchainService + get() = extensions.getByType(JavaToolchainService::class.java) + internal inline fun ObjectFactory.property( defaultValue: Any? = null, ): Property = property(V::class.java).apply { diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.kt index 214c99ac9..4f1edc074 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.kt @@ -11,6 +11,7 @@ import com.github.jengelman.gradle.plugins.shadow.internal.ZipCompressor import com.github.jengelman.gradle.plugins.shadow.internal.fileCollection import com.github.jengelman.gradle.plugins.shadow.internal.property import com.github.jengelman.gradle.plugins.shadow.internal.setProperty +import com.github.jengelman.gradle.plugins.shadow.internal.sourceSets import com.github.jengelman.gradle.plugins.shadow.relocation.CacheableRelocator import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator import com.github.jengelman.gradle.plugins.shadow.relocation.SimpleRelocator @@ -43,7 +44,6 @@ import org.gradle.api.tasks.Nested import org.gradle.api.tasks.Optional import org.gradle.api.tasks.PathSensitive import org.gradle.api.tasks.PathSensitivity -import org.gradle.api.tasks.SourceSetContainer import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.bundling.Jar import org.gradle.api.tasks.bundling.ZipEntryCompression @@ -94,8 +94,7 @@ public abstract class ShadowJar : public open val sourceSetsClassesDirs: ConfigurableFileCollection = objectFactory.fileCollection { minimizeJar.map { if (it) { - project.extensions.getByType(SourceSetContainer::class.java) - .map { sourceSet -> sourceSet.output.classesDirs.filter(File::isDirectory) } + project.sourceSets.map { sourceSet -> sourceSet.output.classesDirs.filter(File::isDirectory) } } else { emptySet() } From c71ecaf095f12b86a188fa69202079caef283560 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 29 Jan 2025 14:23:34 +0800 Subject: [PATCH 2/6] Add extensions for project TaskContainer --- api/shadow.api | 4 ++- .../plugins/shadow/ShadowApplicationPlugin.kt | 29 ++++++++++--------- .../gradle/plugins/shadow/ShadowJavaPlugin.kt | 8 +++-- .../plugins/shadow/internal/GradleCompat.kt | 6 ++++ 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/api/shadow.api b/api/shadow.api index ec3e5ccc3..1203acef7 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -11,10 +11,11 @@ public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowApplicati protected fun configureDistSpec ()V protected fun configureInstallTask ()V protected fun configureJarMainClass ()V - protected final fun getShadowJar ()Lorg/gradle/api/tasks/TaskProvider; } public final class com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin$Companion { + public final fun getInstallShadowDist (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider; + public final fun getStartShadowScripts (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider; } public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin : org/gradle/api/Plugin { @@ -48,6 +49,7 @@ public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugi } public final class com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin$Companion { + public final fun getShadowJar (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider; } public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowPlugin : org/gradle/api/Plugin { diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt index 13696e846..9d488f9c2 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt @@ -1,11 +1,11 @@ package com.github.jengelman.gradle.plugins.shadow +import com.github.jengelman.gradle.plugins.shadow.ShadowJavaPlugin.Companion.shadowJar import com.github.jengelman.gradle.plugins.shadow.internal.applicationExtension import com.github.jengelman.gradle.plugins.shadow.internal.distributions import com.github.jengelman.gradle.plugins.shadow.internal.javaPluginExtension import com.github.jengelman.gradle.plugins.shadow.internal.javaToolchainService import com.github.jengelman.gradle.plugins.shadow.internal.requireResourceAsText -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project @@ -14,6 +14,7 @@ import org.gradle.api.plugins.JavaApplication import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.tasks.JavaExec import org.gradle.api.tasks.Sync +import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.application.CreateStartScripts import org.gradle.jvm.application.scripts.TemplateBasedScriptGenerator @@ -40,7 +41,7 @@ public abstract class ShadowApplicationPlugin : Plugin { protected open fun configureJarMainClass() { val classNameProvider = javaApplication.mainClass - shadowJar.configure { task -> + project.tasks.shadowJar.configure { task -> task.inputs.property("mainClassName", classNameProvider) task.doFirst { // Inject the Main-Class attribute if it is not already present. @@ -55,9 +56,9 @@ public abstract class ShadowApplicationPlugin : Plugin { project.tasks.register(SHADOW_RUN_TASK_NAME, JavaExec::class.java) { task -> task.description = "Runs this project as a JVM application using the shadow jar" task.group = ApplicationPlugin.APPLICATION_GROUP - task.dependsOn(installShadowDist) + task.dependsOn(project.tasks.installShadowDist) - val jarFile = installShadowDist.zip(shadowJar) { i, s -> + val jarFile = project.tasks.installShadowDist.zip(project.tasks.shadowJar) { i, s -> i.destinationDir.resolve("lib/${s.archiveFile.get().asFile.name}") } task.classpath(jarFile) @@ -84,7 +85,7 @@ public abstract class ShadowApplicationPlugin : Plugin { (task.windowsStartScriptGenerator as TemplateBasedScriptGenerator).template = project.resources.text.fromString(windowsStartScript) - task.classpath = project.files(shadowJar) + task.classpath = project.files(project.tasks.shadowJar) task.mainModule.set(javaApplication.mainModule) task.mainClass.set(javaApplication.mainClass) task.conventionMapping.map("applicationName", javaApplication::getApplicationName) @@ -96,7 +97,7 @@ public abstract class ShadowApplicationPlugin : Plugin { } protected open fun configureInstallTask() { - installShadowDist.configure { task -> + project.tasks.installShadowDist.configure { task -> val applicationName = project.providers.provider { javaApplication.applicationName } task.doFirst { @@ -129,26 +130,26 @@ public abstract class ShadowApplicationPlugin : Plugin { distributions.contents { contents -> contents.from(project.file("src/dist")) contents.into("lib") { lib -> - lib.from(shadowJar) + lib.from(project.tasks.shadowJar) lib.from(project.configurations.named(ShadowBasePlugin.CONFIGURATION_NAME)) } contents.into("bin") { bin -> - bin.from(project.tasks.named(SHADOW_SCRIPTS_TASK_NAME)) + bin.from(project.tasks.startShadowScripts) bin.filePermissions { it.unix(493) } } } } } - protected val shadowJar: TaskProvider - get() = project.tasks.named(ShadowJavaPlugin.SHADOW_JAR_TASK_NAME, ShadowJar::class.java) - - private val installShadowDist: TaskProvider - get() = project.tasks.named(SHADOW_INSTALL_TASK_NAME, Sync::class.java) - public companion object { public const val SHADOW_RUN_TASK_NAME: String = "runShadow" public const val SHADOW_SCRIPTS_TASK_NAME: String = "startShadowScripts" public const val SHADOW_INSTALL_TASK_NAME: String = "installShadowDist" + + public inline val TaskContainer.startShadowScripts: TaskProvider + get() = named(SHADOW_SCRIPTS_TASK_NAME, CreateStartScripts::class.java) + + public inline val TaskContainer.installShadowDist: TaskProvider + get() = named(SHADOW_INSTALL_TASK_NAME, Sync::class.java) } } diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt index e5a355581..61b5aad5b 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt @@ -1,5 +1,6 @@ package com.github.jengelman.gradle.plugins.shadow +import com.github.jengelman.gradle.plugins.shadow.internal.jar import com.github.jengelman.gradle.plugins.shadow.internal.javaPluginExtension import com.github.jengelman.gradle.plugins.shadow.internal.runtimeConfiguration import com.github.jengelman.gradle.plugins.shadow.internal.sourceSets @@ -16,8 +17,8 @@ import org.gradle.api.attributes.java.TargetJvmVersion import org.gradle.api.component.AdhocComponentWithVariants import org.gradle.api.component.SoftwareComponentFactory import org.gradle.api.plugins.JavaPlugin +import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskProvider -import org.gradle.jvm.tasks.Jar import org.gradle.plugin.devel.plugins.JavaGradlePluginPlugin public abstract class ShadowJavaPlugin @Inject constructor( @@ -80,7 +81,7 @@ public abstract class ShadowJavaPlugin @Inject constructor( } private fun configureShadowTask(project: Project, shadowConfiguration: Configuration): TaskProvider { - val jarTask = project.tasks.named(JavaPlugin.JAR_TASK_NAME, Jar::class.java) + val jarTask = project.tasks.jar val taskProvider = project.tasks.register(SHADOW_JAR_TASK_NAME, ShadowJar::class.java) { shadow -> shadow.group = ShadowBasePlugin.GROUP_NAME shadow.description = "Create a combined JAR of project and runtime dependencies" @@ -114,5 +115,8 @@ public abstract class ShadowJavaPlugin @Inject constructor( public companion object { public const val SHADOW_JAR_TASK_NAME: String = "shadowJar" public const val SHADOW_RUNTIME_ELEMENTS_CONFIGURATION_NAME: String = "shadowRuntimeElements" + + public inline val TaskContainer.shadowJar: TaskProvider + get() = named(SHADOW_JAR_TASK_NAME, ShadowJar::class.java) } } diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt index 3472f5718..e7e7299b8 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/GradleCompat.kt @@ -14,6 +14,9 @@ import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.provider.SetProperty import org.gradle.api.tasks.SourceSetContainer +import org.gradle.api.tasks.TaskContainer +import org.gradle.api.tasks.TaskProvider +import org.gradle.jvm.tasks.Jar import org.gradle.jvm.toolchain.JavaToolchainService import org.gradle.util.GradleVersion @@ -41,6 +44,9 @@ internal inline val Project.javaPluginExtension: JavaPluginExtension internal inline val Project.javaToolchainService: JavaToolchainService get() = extensions.getByType(JavaToolchainService::class.java) +internal inline val TaskContainer.jar: TaskProvider + get() = named("jar", Jar::class.java) + internal inline fun ObjectFactory.property( defaultValue: Any? = null, ): Property = property(V::class.java).apply { From 943796e28eb13d700911dced2218e9928ed1f431 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 29 Jan 2025 14:57:27 +0800 Subject: [PATCH 3/6] Remove explicit dependsOn --- .../jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt index 9d488f9c2..7566d1613 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt @@ -56,7 +56,6 @@ public abstract class ShadowApplicationPlugin : Plugin { project.tasks.register(SHADOW_RUN_TASK_NAME, JavaExec::class.java) { task -> task.description = "Runs this project as a JVM application using the shadow jar" task.group = ApplicationPlugin.APPLICATION_GROUP - task.dependsOn(project.tasks.installShadowDist) val jarFile = project.tasks.installShadowDist.zip(project.tasks.shadowJar) { i, s -> i.destinationDir.resolve("lib/${s.archiveFile.get().asFile.name}") From 5054fbf2b81da0236e65b35c5691bdac3af96a3d Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 29 Jan 2025 15:23:54 +0800 Subject: [PATCH 4/6] Move configuring logic into project extensions --- api/shadow.api | 16 ++- .../plugins/shadow/ShadowApplicationPlugin.kt | 53 ++++---- .../gradle/plugins/shadow/ShadowBasePlugin.kt | 6 + .../gradle/plugins/shadow/ShadowJavaPlugin.kt | 118 ++++++++++-------- 4 files changed, 109 insertions(+), 84 deletions(-) diff --git a/api/shadow.api b/api/shadow.api index 1203acef7..bf19d9a9d 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -4,13 +4,13 @@ public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowApplicati public static final field SHADOW_RUN_TASK_NAME Ljava/lang/String; public static final field SHADOW_SCRIPTS_TASK_NAME Ljava/lang/String; public fun ()V - protected fun addCreateScriptsTask ()V - protected fun addRunTask ()V + protected fun addCreateScriptsTask (Lorg/gradle/api/Project;)V + protected fun addRunTask (Lorg/gradle/api/Project;)V public synthetic fun apply (Ljava/lang/Object;)V public fun apply (Lorg/gradle/api/Project;)V - protected fun configureDistSpec ()V - protected fun configureInstallTask ()V - protected fun configureJarMainClass ()V + protected fun configureDistSpec (Lorg/gradle/api/Project;)V + protected fun configureInstallTask (Lorg/gradle/api/Project;)V + protected fun configureJarMainClass (Lorg/gradle/api/Project;)V } public final class com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin$Companion { @@ -32,6 +32,7 @@ public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugi } public final class com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin$Companion { + public final fun getShadow (Lorg/gradle/api/artifacts/ConfigurationContainer;)Lorg/gradle/api/NamedDomainObjectProvider; } public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowExtension { @@ -46,10 +47,15 @@ public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugi public fun (Lorg/gradle/api/component/SoftwareComponentFactory;)V public synthetic fun apply (Ljava/lang/Object;)V public fun apply (Lorg/gradle/api/Project;)V + protected fun configureComponents (Lorg/gradle/api/Project;)V + protected fun configureConfigurations (Lorg/gradle/api/Project;)V + protected fun configureJavaGradlePlugin (Lorg/gradle/api/Project;)V + protected fun configureShadowTask (Lorg/gradle/api/Project;)Lorg/gradle/api/tasks/TaskProvider; } public final class com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin$Companion { public final fun getShadowJar (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider; + public final fun getShadowRuntimeElements (Lorg/gradle/api/artifacts/ConfigurationContainer;)Lorg/gradle/api/NamedDomainObjectProvider; } public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowPlugin : org/gradle/api/Plugin { diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt index 7566d1613..45bf05ef1 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt @@ -1,5 +1,6 @@ package com.github.jengelman.gradle.plugins.shadow +import com.github.jengelman.gradle.plugins.shadow.ShadowBasePlugin.Companion.shadow import com.github.jengelman.gradle.plugins.shadow.ShadowJavaPlugin.Companion.shadowJar import com.github.jengelman.gradle.plugins.shadow.internal.applicationExtension import com.github.jengelman.gradle.plugins.shadow.internal.distributions @@ -21,27 +22,25 @@ import org.gradle.jvm.application.scripts.TemplateBasedScriptGenerator import org.gradle.jvm.toolchain.JavaToolchainService public abstract class ShadowApplicationPlugin : Plugin { - private lateinit var project: Project private lateinit var javaApplication: JavaApplication private lateinit var javaPluginExtension: JavaPluginExtension private lateinit var javaToolchainService: JavaToolchainService override fun apply(project: Project) { - this.project = project this.javaApplication = project.applicationExtension this.javaPluginExtension = project.javaPluginExtension this.javaToolchainService = project.javaToolchainService - addRunTask() - addCreateScriptsTask() - configureDistSpec() - configureJarMainClass() - configureInstallTask() + project.addRunTask() + project.addCreateScriptsTask() + project.configureDistSpec() + project.configureJarMainClass() + project.configureInstallTask() } - protected open fun configureJarMainClass() { + protected open fun Project.configureJarMainClass() { val classNameProvider = javaApplication.mainClass - project.tasks.shadowJar.configure { task -> + tasks.shadowJar.configure { task -> task.inputs.property("mainClassName", classNameProvider) task.doFirst { // Inject the Main-Class attribute if it is not already present. @@ -52,12 +51,12 @@ public abstract class ShadowApplicationPlugin : Plugin { } } - protected open fun addRunTask() { - project.tasks.register(SHADOW_RUN_TASK_NAME, JavaExec::class.java) { task -> + protected open fun Project.addRunTask() { + tasks.register(SHADOW_RUN_TASK_NAME, JavaExec::class.java) { task -> task.description = "Runs this project as a JVM application using the shadow jar" task.group = ApplicationPlugin.APPLICATION_GROUP - val jarFile = project.tasks.installShadowDist.zip(project.tasks.shadowJar) { i, s -> + val jarFile = tasks.installShadowDist.zip(tasks.shadowJar) { i, s -> i.destinationDir.resolve("lib/${s.archiveFile.get().asFile.name}") } task.classpath(jarFile) @@ -70,8 +69,8 @@ public abstract class ShadowApplicationPlugin : Plugin { /** * Syncs with [ApplicationPlugin.addCreateScriptsTask](https://github.com/gradle/gradle/blob/bcecbb416f19438c7532e309456e3c3ed287f8f5/platforms/jvm/plugins-application/src/main/java/org/gradle/api/plugins/ApplicationPlugin.java#L184-L203). */ - protected open fun addCreateScriptsTask() { - project.tasks.register(SHADOW_SCRIPTS_TASK_NAME, CreateStartScripts::class.java) { task -> + protected open fun Project.addCreateScriptsTask() { + tasks.register(SHADOW_SCRIPTS_TASK_NAME, CreateStartScripts::class.java) { task -> task.description = "Creates OS specific scripts to run the project as a JVM application using the shadow jar" task.group = ApplicationPlugin.APPLICATION_GROUP @@ -80,24 +79,24 @@ public abstract class ShadowApplicationPlugin : Plugin { val windowsStartScript = requireResourceAsText("com/github/jengelman/gradle/plugins/shadow/internal/windowsStartScript.txt") (task.unixStartScriptGenerator as TemplateBasedScriptGenerator).template = - project.resources.text.fromString(unixStartScript) + resources.text.fromString(unixStartScript) (task.windowsStartScriptGenerator as TemplateBasedScriptGenerator).template = - project.resources.text.fromString(windowsStartScript) + resources.text.fromString(windowsStartScript) - task.classpath = project.files(project.tasks.shadowJar) + task.classpath = files(tasks.shadowJar) task.mainModule.set(javaApplication.mainModule) task.mainClass.set(javaApplication.mainClass) task.conventionMapping.map("applicationName", javaApplication::getApplicationName) - task.conventionMapping.map("outputDir") { project.layout.buildDirectory.dir("scriptsShadow").get().asFile } + task.conventionMapping.map("outputDir") { layout.buildDirectory.dir("scriptsShadow").get().asFile } task.conventionMapping.map("executableDir", javaApplication::getExecutableDir) task.conventionMapping.map("defaultJvmOpts", javaApplication::getApplicationDefaultJvmArgs) task.modularity.inferModulePath.convention(javaPluginExtension.modularity.inferModulePath) } } - protected open fun configureInstallTask() { - project.tasks.installShadowDist.configure { task -> - val applicationName = project.providers.provider { javaApplication.applicationName } + protected open fun Project.configureInstallTask() { + tasks.installShadowDist.configure { task -> + val applicationName = providers.provider { javaApplication.applicationName } task.doFirst { if ( @@ -124,16 +123,16 @@ public abstract class ShadowApplicationPlugin : Plugin { } } - protected open fun configureDistSpec() { - project.distributions.register(ShadowBasePlugin.DISTRIBUTION_NAME) { distributions -> + protected open fun Project.configureDistSpec() { + distributions.register(ShadowBasePlugin.DISTRIBUTION_NAME) { distributions -> distributions.contents { contents -> - contents.from(project.file("src/dist")) + contents.from(file("src/dist")) contents.into("lib") { lib -> - lib.from(project.tasks.shadowJar) - lib.from(project.configurations.named(ShadowBasePlugin.CONFIGURATION_NAME)) + lib.from(tasks.shadowJar) + lib.from(configurations.shadow) } contents.into("bin") { bin -> - bin.from(project.tasks.startShadowScripts) + bin.from(tasks.startShadowScripts) bin.filePermissions { it.unix(493) } } } diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin.kt index bdf44ea48..dd03e4387 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin.kt @@ -2,8 +2,11 @@ package com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.tasks.KnowsTask import org.gradle.api.GradleException +import org.gradle.api.NamedDomainObjectProvider import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.util.GradleVersion public abstract class ShadowBasePlugin : Plugin { @@ -27,5 +30,8 @@ public abstract class ShadowBasePlugin : Plugin { public const val CONFIGURATION_NAME: String = SHADOW public const val COMPONENT_NAME: String = SHADOW public const val DISTRIBUTION_NAME: String = SHADOW + + public inline val ConfigurationContainer.shadow: NamedDomainObjectProvider + get() = named(CONFIGURATION_NAME) } } diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt index 61b5aad5b..5c744537e 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt @@ -1,14 +1,17 @@ package com.github.jengelman.gradle.plugins.shadow +import com.github.jengelman.gradle.plugins.shadow.ShadowBasePlugin.Companion.shadow import com.github.jengelman.gradle.plugins.shadow.internal.jar import com.github.jengelman.gradle.plugins.shadow.internal.javaPluginExtension import com.github.jengelman.gradle.plugins.shadow.internal.runtimeConfiguration import com.github.jengelman.gradle.plugins.shadow.internal.sourceSets import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import javax.inject.Inject +import org.gradle.api.NamedDomainObjectProvider import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.attributes.Bundling import org.gradle.api.attributes.Category import org.gradle.api.attributes.LibraryElements @@ -26,90 +29,98 @@ public abstract class ShadowJavaPlugin @Inject constructor( ) : Plugin { override fun apply(project: Project) { - val shadowConfiguration = project.configurations.getByName(ShadowBasePlugin.CONFIGURATION_NAME) - val shadowTaskProvider = configureShadowTask(project, shadowConfiguration) + project.configureShadowTask() + project.configureConfigurations() + project.configureComponents() + project.configureJavaGradlePlugin() + } - project.configurations.named(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME) { - it.extendsFrom(shadowConfiguration) + protected open fun Project.configureShadowTask(): TaskProvider { + val jarTask = tasks.jar + val taskProvider = tasks.register(SHADOW_JAR_TASK_NAME, ShadowJar::class.java) { shadow -> + shadow.group = ShadowBasePlugin.GROUP_NAME + shadow.description = "Create a combined JAR of project and runtime dependencies" + shadow.archiveClassifier.set("all") + @Suppress("EagerGradleConfiguration") + shadow.manifest.inheritFrom(jarTask.get().manifest) + val attrProvider = jarTask.map { it.manifest.attributes["Class-Path"]?.toString().orEmpty() } + val files = files(configurations.shadow) + shadow.doFirst { + if (!files.isEmpty) { + val attrs = listOf(attrProvider.getOrElse("")) + files.map { it.name } + shadow.manifest.attributes["Class-Path"] = attrs.joinToString(" ").trim() + } + } + shadow.from(sourceSets.named("main").map { it.output }) + shadow.configurations.convention(listOf(runtimeConfiguration)) + shadow.exclude( + "META-INF/INDEX.LIST", + "META-INF/*.SF", + "META-INF/*.DSA", + "META-INF/*.RSA", + // module-info.class in Multi-Release folders. + "META-INF/versions/**/module-info.class", + "module-info.class", + ) } + artifacts.add(configurations.shadow.name, taskProvider) + return taskProvider + } - val shadowRuntimeElements = project.configurations.create(SHADOW_RUNTIME_ELEMENTS_CONFIGURATION_NAME) { + protected open fun Project.configureConfigurations() { + val shadowConfiguration = configurations.shadow.get() + configurations.named(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME) { + it.extendsFrom(shadowConfiguration) + } + configurations.create(SHADOW_RUNTIME_ELEMENTS_CONFIGURATION_NAME) { it.extendsFrom(shadowConfiguration) it.isCanBeConsumed = true it.isCanBeResolved = false it.attributes { attr -> - attr.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class.java, Usage.JAVA_RUNTIME)) - attr.attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category::class.java, Category.LIBRARY)) + attr.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, Usage.JAVA_RUNTIME)) + attr.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category::class.java, Category.LIBRARY)) attr.attribute( LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, - project.objects.named(LibraryElements::class.java, LibraryElements.JAR), + objects.named(LibraryElements::class.java, LibraryElements.JAR), ) - attr.attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling::class.java, Bundling.SHADOWED)) - val targetJvmVersion = project.provider { - project.javaPluginExtension.targetCompatibility.majorVersion.toInt() + attr.attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling::class.java, Bundling.SHADOWED)) + val targetJvmVersion = provider { + javaPluginExtension.targetCompatibility.majorVersion.toInt() } // Track JavaPluginExtension to update targetJvmVersion when it changes. attr.attributeProvider(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, targetJvmVersion) } - it.outgoing.artifact(shadowTaskProvider) + it.outgoing.artifact(tasks.shadowJar) } + } - project.components.named("java", AdhocComponentWithVariants::class.java) { + protected open fun Project.configureComponents() { + val shadowRuntimeElements = configurations.shadowRuntimeElements.get() + components.named("java", AdhocComponentWithVariants::class.java) { it.addVariantsFromConfiguration(shadowRuntimeElements) { variant -> variant.mapToOptional() } } - val shadowComponent = softwareComponentFactory.adhoc(ShadowBasePlugin.COMPONENT_NAME) - project.components.add(shadowComponent) + components.add(shadowComponent) shadowComponent.addVariantsFromConfiguration(shadowRuntimeElements) { variant -> variant.mapToMavenScope("runtime") } + } - project.plugins.withType(JavaGradlePluginPlugin::class.java).configureEach { + protected open fun Project.configureJavaGradlePlugin() { + plugins.withType(JavaGradlePluginPlugin::class.java).configureEach { // Remove the gradleApi so it isn't merged into the jar file. // This is required because 'java-gradle-plugin' adds gradleApi() to the 'api' configuration. // See https://github.com/gradle/gradle/blob/972c3e5c6ef990dd2190769c1ce31998a9402a79/subprojects/plugin-development/src/main/java/org/gradle/plugin/de - project.configurations.named(JavaPlugin.API_CONFIGURATION_NAME) { - it.dependencies.remove(project.dependencies.gradleApi()) + configurations.named(JavaPlugin.API_CONFIGURATION_NAME) { + it.dependencies.remove(dependencies.gradleApi()) } // Compile only gradleApi() to make sure the plugin can compile against Gradle API. - project.configurations.named(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME) { - it.dependencies.add(project.dependencies.gradleApi()) - } - } - } - - private fun configureShadowTask(project: Project, shadowConfiguration: Configuration): TaskProvider { - val jarTask = project.tasks.jar - val taskProvider = project.tasks.register(SHADOW_JAR_TASK_NAME, ShadowJar::class.java) { shadow -> - shadow.group = ShadowBasePlugin.GROUP_NAME - shadow.description = "Create a combined JAR of project and runtime dependencies" - shadow.archiveClassifier.set("all") - @Suppress("EagerGradleConfiguration") - shadow.manifest.inheritFrom(jarTask.get().manifest) - val attrProvider = jarTask.map { it.manifest.attributes["Class-Path"]?.toString().orEmpty() } - val files = project.files(shadowConfiguration) - shadow.doFirst { - if (!files.isEmpty) { - val attrs = listOf(attrProvider.getOrElse("")) + files.map { it.name } - shadow.manifest.attributes["Class-Path"] = attrs.joinToString(" ").trim() - } + configurations.named(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME) { + it.dependencies.add(dependencies.gradleApi()) } - shadow.from(project.sourceSets.named("main").map { it.output }) - shadow.configurations.convention(listOf(project.runtimeConfiguration)) - shadow.exclude( - "META-INF/INDEX.LIST", - "META-INF/*.SF", - "META-INF/*.DSA", - "META-INF/*.RSA", - // module-info.class in Multi-Release folders. - "META-INF/versions/**/module-info.class", - "module-info.class", - ) } - project.artifacts.add(shadowConfiguration.name, taskProvider) - return taskProvider } public companion object { @@ -118,5 +129,8 @@ public abstract class ShadowJavaPlugin @Inject constructor( public inline val TaskContainer.shadowJar: TaskProvider get() = named(SHADOW_JAR_TASK_NAME, ShadowJar::class.java) + + public inline val ConfigurationContainer.shadowRuntimeElements: NamedDomainObjectProvider + get() = named(SHADOW_RUNTIME_ELEMENTS_CONFIGURATION_NAME) } } From 3f897081efa8fabb01ad0829ee3a92479741e10c Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 29 Jan 2025 15:32:34 +0800 Subject: [PATCH 5/6] Simplify ShadowPlugin.apply --- .../gradle/plugins/shadow/ShadowPlugin.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowPlugin.kt index e0cde72f2..f89b51377 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowPlugin.kt @@ -9,22 +9,22 @@ import org.gradle.api.plugins.JavaPlugin public abstract class ShadowPlugin : Plugin { override fun apply(project: Project) { - project.run { - plugins.apply(ShadowBasePlugin::class.java) + with(project.plugins) { + apply(ShadowBasePlugin::class.java) @Suppress("WithTypeWithoutConfigureEach") - plugins.withType(JavaPlugin::class.java) { - plugins.apply(ShadowJavaPlugin::class.java) + withType(JavaPlugin::class.java) { + apply(ShadowJavaPlugin::class.java) } @Suppress("WithTypeWithoutConfigureEach") - plugins.withType(ApplicationPlugin::class.java) { - plugins.apply(ShadowApplicationPlugin::class.java) + withType(ApplicationPlugin::class.java) { + apply(ShadowApplicationPlugin::class.java) } // Apply the legacy plugin last // Because we apply the ShadowJavaPlugin/ShadowApplication plugin in a withType callback for the // respective JavaPlugin/ApplicationPlugin, it may still apply before the shadowJar task is created etc. // If the user applies shadow before those plugins. However, this is fine, because this was also // the behavior with the old plugin when applying in that order. - plugins.apply(LegacyShadowPlugin::class.java) + apply(LegacyShadowPlugin::class.java) } } } From 2fceb20c52687f9e62d4a015c064444c4643e6a6 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 29 Jan 2025 17:17:55 +0800 Subject: [PATCH 6/6] Cleanups --- api/shadow.api | 2 +- .../plugins/shadow/ShadowApplicationPlugin.kt | 44 +++++++------------ .../gradle/plugins/shadow/ShadowJavaPlugin.kt | 25 +++++------ 3 files changed, 29 insertions(+), 42 deletions(-) diff --git a/api/shadow.api b/api/shadow.api index bf19d9a9d..4e38af587 100644 --- a/api/shadow.api +++ b/api/shadow.api @@ -50,7 +50,7 @@ public abstract class com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugi protected fun configureComponents (Lorg/gradle/api/Project;)V protected fun configureConfigurations (Lorg/gradle/api/Project;)V protected fun configureJavaGradlePlugin (Lorg/gradle/api/Project;)V - protected fun configureShadowTask (Lorg/gradle/api/Project;)Lorg/gradle/api/tasks/TaskProvider; + protected fun configureShadowJar (Lorg/gradle/api/Project;)V } public final class com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin$Companion { diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt index 45bf05ef1..c4bb1bcac 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowApplicationPlugin.kt @@ -11,26 +11,15 @@ import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.plugins.ApplicationPlugin -import org.gradle.api.plugins.JavaApplication -import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.tasks.JavaExec import org.gradle.api.tasks.Sync import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.application.CreateStartScripts import org.gradle.jvm.application.scripts.TemplateBasedScriptGenerator -import org.gradle.jvm.toolchain.JavaToolchainService public abstract class ShadowApplicationPlugin : Plugin { - private lateinit var javaApplication: JavaApplication - private lateinit var javaPluginExtension: JavaPluginExtension - private lateinit var javaToolchainService: JavaToolchainService - override fun apply(project: Project) { - this.javaApplication = project.applicationExtension - this.javaPluginExtension = project.javaPluginExtension - this.javaToolchainService = project.javaToolchainService - project.addRunTask() project.addCreateScriptsTask() project.configureDistSpec() @@ -39,19 +28,20 @@ public abstract class ShadowApplicationPlugin : Plugin { } protected open fun Project.configureJarMainClass() { - val classNameProvider = javaApplication.mainClass + val mainClassName = applicationExtension.mainClass tasks.shadowJar.configure { task -> - task.inputs.property("mainClassName", classNameProvider) + task.inputs.property("mainClassName", mainClassName) task.doFirst { // Inject the Main-Class attribute if it is not already present. if (!task.manifest.attributes.contains("Main-Class")) { - task.manifest.attributes["Main-Class"] = classNameProvider.get() + task.manifest.attributes["Main-Class"] = mainClassName.get() } } } } protected open fun Project.addRunTask() { + val extension = applicationExtension tasks.register(SHADOW_RUN_TASK_NAME, JavaExec::class.java) { task -> task.description = "Runs this project as a JVM application using the shadow jar" task.group = ApplicationPlugin.APPLICATION_GROUP @@ -60,8 +50,8 @@ public abstract class ShadowApplicationPlugin : Plugin { i.destinationDir.resolve("lib/${s.archiveFile.get().asFile.name}") } task.classpath(jarFile) - task.mainClass.set(javaApplication.mainClass) - task.conventionMapping.map("jvmArgs", javaApplication::getApplicationDefaultJvmArgs) + task.mainClass.set(extension.mainClass) + task.conventionMapping.map("jvmArgs", extension::getApplicationDefaultJvmArgs) task.javaLauncher.set(javaToolchainService.launcherFor(javaPluginExtension.toolchain)) } } @@ -70,33 +60,31 @@ public abstract class ShadowApplicationPlugin : Plugin { * Syncs with [ApplicationPlugin.addCreateScriptsTask](https://github.com/gradle/gradle/blob/bcecbb416f19438c7532e309456e3c3ed287f8f5/platforms/jvm/plugins-application/src/main/java/org/gradle/api/plugins/ApplicationPlugin.java#L184-L203). */ protected open fun Project.addCreateScriptsTask() { + val extension = applicationExtension tasks.register(SHADOW_SCRIPTS_TASK_NAME, CreateStartScripts::class.java) { task -> task.description = "Creates OS specific scripts to run the project as a JVM application using the shadow jar" task.group = ApplicationPlugin.APPLICATION_GROUP - val unixStartScript = - requireResourceAsText("com/github/jengelman/gradle/plugins/shadow/internal/unixStartScript.txt") - val windowsStartScript = - requireResourceAsText("com/github/jengelman/gradle/plugins/shadow/internal/windowsStartScript.txt") + val dir = "com/github/jengelman/gradle/plugins/shadow/internal" (task.unixStartScriptGenerator as TemplateBasedScriptGenerator).template = - resources.text.fromString(unixStartScript) + resources.text.fromString(requireResourceAsText("$dir/unixStartScript.txt")) (task.windowsStartScriptGenerator as TemplateBasedScriptGenerator).template = - resources.text.fromString(windowsStartScript) + resources.text.fromString(requireResourceAsText("$dir/windowsStartScript.txt")) task.classpath = files(tasks.shadowJar) - task.mainModule.set(javaApplication.mainModule) - task.mainClass.set(javaApplication.mainClass) - task.conventionMapping.map("applicationName", javaApplication::getApplicationName) + task.mainModule.set(extension.mainModule) + task.mainClass.set(extension.mainClass) + task.conventionMapping.map("applicationName", extension::getApplicationName) task.conventionMapping.map("outputDir") { layout.buildDirectory.dir("scriptsShadow").get().asFile } - task.conventionMapping.map("executableDir", javaApplication::getExecutableDir) - task.conventionMapping.map("defaultJvmOpts", javaApplication::getApplicationDefaultJvmArgs) + task.conventionMapping.map("executableDir", extension::getExecutableDir) + task.conventionMapping.map("defaultJvmOpts", extension::getApplicationDefaultJvmArgs) task.modularity.inferModulePath.convention(javaPluginExtension.modularity.inferModulePath) } } protected open fun Project.configureInstallTask() { tasks.installShadowDist.configure { task -> - val applicationName = providers.provider { javaApplication.applicationName } + val applicationName = providers.provider { applicationExtension.applicationName } task.doFirst { if ( diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt index 5c744537e..e2e350fc6 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.kt @@ -29,31 +29,31 @@ public abstract class ShadowJavaPlugin @Inject constructor( ) : Plugin { override fun apply(project: Project) { - project.configureShadowTask() + project.configureShadowJar() project.configureConfigurations() project.configureComponents() project.configureJavaGradlePlugin() } - protected open fun Project.configureShadowTask(): TaskProvider { + protected open fun Project.configureShadowJar() { val jarTask = tasks.jar - val taskProvider = tasks.register(SHADOW_JAR_TASK_NAME, ShadowJar::class.java) { shadow -> - shadow.group = ShadowBasePlugin.GROUP_NAME - shadow.description = "Create a combined JAR of project and runtime dependencies" - shadow.archiveClassifier.set("all") + val taskProvider = tasks.register(SHADOW_JAR_TASK_NAME, ShadowJar::class.java) { task -> + task.group = ShadowBasePlugin.GROUP_NAME + task.description = "Create a combined JAR of project and runtime dependencies" + task.archiveClassifier.set("all") @Suppress("EagerGradleConfiguration") - shadow.manifest.inheritFrom(jarTask.get().manifest) + task.manifest.inheritFrom(jarTask.get().manifest) val attrProvider = jarTask.map { it.manifest.attributes["Class-Path"]?.toString().orEmpty() } val files = files(configurations.shadow) - shadow.doFirst { + task.doFirst { if (!files.isEmpty) { val attrs = listOf(attrProvider.getOrElse("")) + files.map { it.name } - shadow.manifest.attributes["Class-Path"] = attrs.joinToString(" ").trim() + task.manifest.attributes["Class-Path"] = attrs.joinToString(" ").trim() } } - shadow.from(sourceSets.named("main").map { it.output }) - shadow.configurations.convention(listOf(runtimeConfiguration)) - shadow.exclude( + task.from(sourceSets.named("main").map { it.output }) + task.configurations.convention(listOf(runtimeConfiguration)) + task.exclude( "META-INF/INDEX.LIST", "META-INF/*.SF", "META-INF/*.DSA", @@ -64,7 +64,6 @@ public abstract class ShadowJavaPlugin @Inject constructor( ) } artifacts.add(configurations.shadow.name, taskProvider) - return taskProvider } protected open fun Project.configureConfigurations() {