From 854dcb76e4a753cc61271e2c5f33145d1f113eab Mon Sep 17 00:00:00 2001 From: Dependency Admin Date: Mon, 6 Jan 2025 14:35:54 +0000 Subject: [PATCH] Setter opp jar-bundling gradle plugin --- buildSrc/build.gradle.kts | 16 ++++++ buildSrc/src/main/kotlin/jarBundling.kt | 72 +++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 buildSrc/src/main/kotlin/jarBundling.kt diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index cbcc24a..380b8d8 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,5 +1,6 @@ plugins { `kotlin-dsl` + `maven-publish` } repositories { @@ -11,3 +12,18 @@ kotlin { languageVersion.set(JavaLanguageVersion.of(17)) } } + +gradlePlugin { + plugins { + create("jar-bundling") { + id = "no.nav.tms.jar-bundling" + implementationClass = "JarBundling" + } + } +} + +publishing { + repositories { + mavenLocal() + } +} diff --git a/buildSrc/src/main/kotlin/jarBundling.kt b/buildSrc/src/main/kotlin/jarBundling.kt new file mode 100644 index 0000000..0dc80e1 --- /dev/null +++ b/buildSrc/src/main/kotlin/jarBundling.kt @@ -0,0 +1,72 @@ +import org.gradle.api.DefaultTask +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaApplication +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction +import org.gradle.jvm.tasks.Jar +import java.io.File + +// Managed by tms-dependency-admin. + +abstract class JarBundling : Plugin { + + override fun apply(target: Project) { + + val configureTask = target.tasks.register("configureJar", ConfigureJarTask::class.java) { + this.application = target + + val classes = target.tasks.named("classes") + + dependsOn(classes) + } + + val packageTask = target.tasks.register("packageJar", BundleJarsTask::class.java) { + this.application = target + } + + target.tasks.withType(Jar::class.java) { + dependsOn(configureTask) + finalizedBy(packageTask) + } + } +} + +abstract class ConfigureJarTask : DefaultTask() { + @Input + lateinit var application: Project + + @TaskAction + fun action() { + application.tasks.withType(Jar::class.java) { + + val javaApplication = application.extensions.getByType(JavaApplication::class.java) + + val mainClassName = javaApplication.mainClass + + archiveBaseName.set("app") + manifest { + val classpath = application.configurations.getByName("runtimeClasspath") + attributes["Main-Class"] = mainClassName + attributes["Class-Path"] = classpath.joinToString(separator = " ") { + it.name + } + } + } + } +} + +abstract class BundleJarsTask : DefaultTask() { + @Input + lateinit var application: Project + + @TaskAction + fun action() { + val classpath = application.configurations.getByName("runtimeClasspath") + + classpath.forEach { + val file = File("${application.layout.buildDirectory.get()}/libs/${it.name}") + if (!file.exists()) it.copyTo(file) + } + } +}