Skip to content

Commit cb6ed4c

Browse files
authored
Honor executableDir and applicationName in application extension (#1740)
* Set `distributionBaseName` * Test `honorApplicationExtensionProperties` * Defer `getExecutableDir` * Check distribution entries * Append suffix to `applicationName` * Update changelog
1 parent 53bd00b commit cb6ed4c

File tree

3 files changed

+43
-5
lines changed

3 files changed

+43
-5
lines changed

docs/changes/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
mainClass = "my.Main"
1616
}
1717
```
18-
- Honor `executableDir` in `application` extension. ([#1738](https://github.com/GradleUp/shadow/pull/1738))
18+
- Honor `executableDir` and `applicationName` in `application` extension. ([#1740](https://github.com/GradleUp/shadow/pull/1738))
19+
This is useful when you want to customize the output directory of the start scripts and the application distribution.
1920

2021
### Changed
2122

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,36 @@ class ApplicationPluginTest : BasePluginTest() {
258258
}
259259
}
260260

261+
@Test
262+
fun honorApplicationExtensionProperties() {
263+
val applicationNames = "new" to "new"
264+
val executableDirs = "sbin" to "sbin"
265+
266+
prepare(
267+
applicationBlock = """
268+
applicationName = '${applicationNames.first}'
269+
executableDir = '${executableDirs.first}'
270+
""".trimIndent(),
271+
)
272+
273+
run(installShadowDistPath, shadowDistZipPath)
274+
275+
assertThat(path("build/install/").walkEntries()).containsOnly(
276+
"${applicationNames.second}-shadow/${executableDirs.second}/${applicationNames.second}",
277+
"${applicationNames.second}-shadow/${executableDirs.second}/${applicationNames.second}.bat",
278+
"${applicationNames.second}-shadow/lib/myapp-1.0-all.jar",
279+
)
280+
val zipPath = path("build/distributions/${applicationNames.second}-shadow-1.0.zip")
281+
ZipFile(zipPath.toFile()).use { zip ->
282+
val entries = zip.entries().toList().filter { !it.isDirectory }.map { it.name }
283+
assertThat(entries).containsOnly(
284+
"${applicationNames.second}-shadow-1.0/${executableDirs.second}/${applicationNames.second}",
285+
"${applicationNames.second}-shadow-1.0/${executableDirs.second}/${applicationNames.second}.bat",
286+
"${applicationNames.second}-shadow-1.0/lib/myapp-1.0-all.jar",
287+
)
288+
}
289+
}
290+
261291
private fun prepare(
262292
mainClassWithImports: Boolean = false,
263293
projectBlock: String = "",

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public abstract class ShadowApplicationPlugin : Plugin<Project> {
4444
with(applicationExtension) {
4545
task.mainModule.convention(mainModule)
4646
task.mainClass.convention(mainClass)
47-
task.jvmArguments.convention(provider { applicationDefaultJvmArgs })
47+
task.jvmArguments.convention(provider(::getApplicationDefaultJvmArgs))
4848
}
4949
task.modularity.inferModulePath.convention(javaPluginExtension.modularity.inferModulePath)
5050
task.javaLauncher.convention(javaToolchainService.launcherFor(javaPluginExtension.toolchain))
@@ -73,8 +73,8 @@ public abstract class ShadowApplicationPlugin : Plugin<Project> {
7373

7474
protected open fun Project.configureInstallTask() {
7575
tasks.installShadowDist.configure { task ->
76-
val applicationName = providers.provider { applicationExtension.applicationName }
77-
val executableDir = providers.provider { applicationExtension.executableDir }
76+
val applicationName = provider(applicationExtension::getApplicationName)
77+
val executableDir = provider(applicationExtension::getExecutableDir)
7878

7979
task.doFirst("Check installation directory") {
8080
val destinationDir = task.destinationDir
@@ -97,6 +97,13 @@ public abstract class ShadowApplicationPlugin : Plugin<Project> {
9797

9898
protected open fun Project.configureDistribution() {
9999
distributions.register(DISTRIBUTION_NAME) {
100+
it.distributionBaseName.convention(
101+
provider {
102+
// distributionBaseName defaults to `$project.name-$distribution.name`, applicationName defaults to project.name
103+
// so we append the suffix to match the default distributionBaseName. Modified from `ApplicationPlugin.configureDistribution()`.
104+
"${applicationExtension.applicationName}-$DISTRIBUTION_NAME"
105+
},
106+
)
100107
it.contents { shadowDist ->
101108
shadowDist.from(file("src/dist"))
102109
shadowDist.into("lib") { lib ->
@@ -105,7 +112,7 @@ public abstract class ShadowApplicationPlugin : Plugin<Project> {
105112
lib.from(configurations.shadow)
106113
}
107114
// Defaults to bin dir.
108-
shadowDist.into(applicationExtension.executableDir) { bin ->
115+
shadowDist.into(provider(applicationExtension::getExecutableDir)) { bin ->
109116
bin.from(tasks.startShadowScripts)
110117
bin.filePermissions { permissions -> permissions.unix(UNIX_SCRIPT_PERMISSIONS) }
111118
}

0 commit comments

Comments
 (0)