diff --git a/docs/changes/README.md b/docs/changes/README.md index 39daa13c5..0ff283ca0 100644 --- a/docs/changes/README.md +++ b/docs/changes/README.md @@ -15,7 +15,8 @@ mainClass = "my.Main" } ``` -- Honor `executableDir` in `application` extension. ([#1738](https://github.com/GradleUp/shadow/pull/1738)) +- Honor `executableDir` and `applicationName` in `application` extension. ([#1740](https://github.com/GradleUp/shadow/pull/1738)) + This is useful when you want to customize the output directory of the start scripts and the application distribution. ### Changed diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/ApplicationPluginTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/ApplicationPluginTest.kt index 964fb5349..03ba0cf38 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/ApplicationPluginTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/ApplicationPluginTest.kt @@ -258,6 +258,36 @@ class ApplicationPluginTest : BasePluginTest() { } } + @Test + fun honorApplicationExtensionProperties() { + val applicationNames = "new" to "new" + val executableDirs = "sbin" to "sbin" + + prepare( + applicationBlock = """ + applicationName = '${applicationNames.first}' + executableDir = '${executableDirs.first}' + """.trimIndent(), + ) + + run(installShadowDistPath, shadowDistZipPath) + + assertThat(path("build/install/").walkEntries()).containsOnly( + "${applicationNames.second}-shadow/${executableDirs.second}/${applicationNames.second}", + "${applicationNames.second}-shadow/${executableDirs.second}/${applicationNames.second}.bat", + "${applicationNames.second}-shadow/lib/myapp-1.0-all.jar", + ) + val zipPath = path("build/distributions/${applicationNames.second}-shadow-1.0.zip") + ZipFile(zipPath.toFile()).use { zip -> + val entries = zip.entries().toList().filter { !it.isDirectory }.map { it.name } + assertThat(entries).containsOnly( + "${applicationNames.second}-shadow-1.0/${executableDirs.second}/${applicationNames.second}", + "${applicationNames.second}-shadow-1.0/${executableDirs.second}/${applicationNames.second}.bat", + "${applicationNames.second}-shadow-1.0/lib/myapp-1.0-all.jar", + ) + } + } + private fun prepare( mainClassWithImports: Boolean = false, projectBlock: String = "", 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 212f54d13..e75395564 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 @@ -44,7 +44,7 @@ public abstract class ShadowApplicationPlugin : Plugin { with(applicationExtension) { task.mainModule.convention(mainModule) task.mainClass.convention(mainClass) - task.jvmArguments.convention(provider { applicationDefaultJvmArgs }) + task.jvmArguments.convention(provider(::getApplicationDefaultJvmArgs)) } task.modularity.inferModulePath.convention(javaPluginExtension.modularity.inferModulePath) task.javaLauncher.convention(javaToolchainService.launcherFor(javaPluginExtension.toolchain)) @@ -73,8 +73,8 @@ public abstract class ShadowApplicationPlugin : Plugin { protected open fun Project.configureInstallTask() { tasks.installShadowDist.configure { task -> - val applicationName = providers.provider { applicationExtension.applicationName } - val executableDir = providers.provider { applicationExtension.executableDir } + val applicationName = provider(applicationExtension::getApplicationName) + val executableDir = provider(applicationExtension::getExecutableDir) task.doFirst("Check installation directory") { val destinationDir = task.destinationDir @@ -97,6 +97,13 @@ public abstract class ShadowApplicationPlugin : Plugin { protected open fun Project.configureDistribution() { distributions.register(DISTRIBUTION_NAME) { + it.distributionBaseName.convention( + provider { + // distributionBaseName defaults to `$project.name-$distribution.name`, applicationName defaults to project.name + // so we append the suffix to match the default distributionBaseName. Modified from `ApplicationPlugin.configureDistribution()`. + "${applicationExtension.applicationName}-$DISTRIBUTION_NAME" + }, + ) it.contents { shadowDist -> shadowDist.from(file("src/dist")) shadowDist.into("lib") { lib -> @@ -105,7 +112,7 @@ public abstract class ShadowApplicationPlugin : Plugin { lib.from(configurations.shadow) } // Defaults to bin dir. - shadowDist.into(applicationExtension.executableDir) { bin -> + shadowDist.into(provider(applicationExtension::getExecutableDir)) { bin -> bin.from(tasks.startShadowScripts) bin.filePermissions { permissions -> permissions.unix(UNIX_SCRIPT_PERMISSIONS) } }