Skip to content

Commit

Permalink
Jars flattening as a separate task to fix packageUberJarForCurrentOS.
Browse files Browse the repository at this point in the history
  • Loading branch information
badmannersteam committed Feb 15, 2024
1 parent 95603ce commit 80bcfc8
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ package org.jetbrains.compose.desktop.application.internal

import org.gradle.api.DefaultTask
import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.file.FileCollection
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.JavaExec
import org.gradle.api.tasks.Sync
Expand All @@ -16,6 +15,7 @@ import org.gradle.jvm.tasks.Jar
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import org.jetbrains.compose.desktop.application.internal.validation.validatePackageVersions
import org.jetbrains.compose.desktop.application.tasks.*
import org.jetbrains.compose.desktop.tasks.AbstractJarsFlattenTask
import org.jetbrains.compose.desktop.tasks.AbstractUnpackDefaultComposeApplicationResourcesTask
import org.jetbrains.compose.internal.utils.*
import org.jetbrains.compose.internal.utils.OS
Expand All @@ -26,7 +26,6 @@ import org.jetbrains.compose.internal.utils.ioFile
import org.jetbrains.compose.internal.utils.ioFileOrNull
import org.jetbrains.compose.internal.utils.javaExecutable
import org.jetbrains.compose.internal.utils.provider
import java.io.File

private val defaultJvmArgs = listOf("-D$CONFIGURE_SWING_GLOBALS=true")
internal const val composeDesktopTaskGroup = "compose desktop"
Expand Down Expand Up @@ -220,11 +219,18 @@ private fun JvmApplicationContext.configurePackagingTasks(
}
}

val flattenJars = tasks.register<AbstractJarsFlattenTask>(
taskNameAction = "flatten",
taskNameObject = "Jars"
) {
configureFlattenJars(this, runProguard)
}

val packageUberJarForCurrentOS = tasks.register<Jar>(
taskNameAction = "package",
taskNameObject = "uberJarForCurrentOS"
) {
configurePackageUberJarForCurrentOS(this, runProguard)
configurePackageUberJarForCurrentOS(this, flattenJars)
}

val runDistributable = tasks.register<AbstractRunDistributableTask>(
Expand Down Expand Up @@ -445,24 +451,29 @@ private fun JvmApplicationContext.configureRunTask(
}
}

private fun JvmApplicationContext.configurePackageUberJarForCurrentOS(
jar: Jar,
private fun JvmApplicationContext.configureFlattenJars(
flattenJars: AbstractJarsFlattenTask,
runProguard: Provider<AbstractProguardTask>?
) {
fun flattenJars(files: FileCollection): FileCollection =
jar.project.files({
files.map { if (it.isZipOrJar()) jar.project.zipTree(it) else it }
})

if (runProguard != null) {
jar.dependsOn(runProguard)
jar.from(flattenJars(project.fileTree(runProguard.flatMap { it.destinationDir })))
flattenJars.dependsOn(runProguard)
flattenJars.inputFiles.from(project.fileTree(runProguard.flatMap { it.destinationDir }))
} else {
jar.useAppRuntimeFiles { (runtimeJars, _) ->
from(flattenJars(runtimeJars))
flattenJars.useAppRuntimeFiles { (runtimeJars, _) ->
inputFiles.from(runtimeJars)
}
}

flattenJars.destinationDir.set(appTmpDir.dir("flattenJars"))
}

private fun JvmApplicationContext.configurePackageUberJarForCurrentOS(
jar: Jar,
flattenJars: Provider<AbstractJarsFlattenTask>
) {
jar.dependsOn(flattenJars)
jar.from(flattenJars.flatMap { it.destinationDir })

app.mainClass?.let { jar.manifest.attributes["Main-Class"] = it }
jar.duplicatesStrategy = DuplicatesStrategy.EXCLUDE
jar.archiveAppendix.set(currentTarget.id)
Expand All @@ -474,8 +485,4 @@ private fun JvmApplicationContext.configurePackageUberJarForCurrentOS(
jar.doLast {
jar.logger.lifecycle("The jar is written to ${jar.archiveFile.ioFile.canonicalPath}")
}
}

private fun File.isZipOrJar() =
name.endsWith(".jar", ignoreCase = true)
|| name.endsWith(".zip", ignoreCase = true)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package org.jetbrains.compose.desktop.tasks

import org.gradle.api.DefaultTask
import org.gradle.api.file.ArchiveOperations
import org.gradle.api.file.Directory
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.model.ObjectFactory
Expand Down Expand Up @@ -33,6 +34,9 @@ abstract class AbstractComposeDesktopTask : DefaultTask() {
@get:Inject
protected abstract val fileOperations: FileSystemOperations

@get:Inject
protected abstract val archiveOperations: ArchiveOperations

@get:LocalState
protected val logsDir: Provider<Directory> = project.layout.buildDirectory.dir("compose/logs/$name")

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright 2020-2024 JetBrains s.r.o. and respective authors and developers.
* Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file.
*/

package org.jetbrains.compose.desktop.tasks

import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import org.jetbrains.compose.internal.utils.clearDirs
import java.io.File

abstract class AbstractJarsFlattenTask : AbstractComposeDesktopTask() {

@get:InputFiles
val inputFiles: ConfigurableFileCollection = objects.fileCollection()

@get:OutputDirectory
val destinationDir: DirectoryProperty = objects.directoryProperty()

@TaskAction
fun execute() {
fileOperations.clearDirs(destinationDir)

fileOperations.copy {
it.duplicatesStrategy = DuplicatesStrategy.EXCLUDE
it.from(flattenJars(inputFiles))
it.into(destinationDir)
}
}

private fun flattenJars(files: FileCollection) = files.map {
when {
it.isZipOrJar() -> this.archiveOperations.zipTree(it)
else -> it
}
}

private fun File.isZipOrJar() = name.endsWith(".jar", ignoreCase = true) || name.endsWith(".zip", ignoreCase = true)
}

0 comments on commit 80bcfc8

Please sign in to comment.