Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/changes/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

- Add Kotlin DSL examples in docs. ([#1306](https://github.com/GradleUp/shadow/pull/1306))
- Support using type-safe dependency accessors in `ShadowJar.dependencies`. ([#1322](https://github.com/GradleUp/shadow/pull/1322))
- Set `Main-Class` attr from `kotlin.jvm().mainRun.mainClass`. ([#1337](https://github.com/GradleUp/shadow/pull/1337))
This is added from Kotlin 2.1.20, which is still experimental.

**Changed**

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.github.jengelman.gradle.plugins.shadow

import assertk.assertThat
import assertk.assertions.isEqualTo
import com.github.jengelman.gradle.plugins.shadow.internal.mainClassAttributeKey
import com.github.jengelman.gradle.plugins.shadow.util.containsEntries
import com.github.jengelman.gradle.plugins.shadow.util.getMainAttr
import kotlin.io.path.appendText
import kotlin.io.path.writeText
import org.junit.jupiter.api.BeforeEach
Expand All @@ -21,11 +24,14 @@ class KmpPluginTest : BasePluginTest() {

@Test
fun compatKmpJvmTarget() {
val mainClass = writeClass(sourceSet = "jvmMain", isJava = false)
val mainClassName = "my.MainKt"
val mainClassPath = writeClass(sourceSet = "jvmMain", isJava = false)
projectScriptPath.appendText(
"""
kotlin {
jvm()
jvm().mainRun {
mainClass = '$mainClassName'
}
sourceSets {
commonMain {
dependencies {
Expand All @@ -46,9 +52,10 @@ class KmpPluginTest : BasePluginTest() {

assertThat(outputShadowJar).useAll {
containsEntries(
mainClass,
mainClassPath,
*entriesInAB,
)
getMainAttr(mainClassAttributeKey).isEqualTo(mainClassName)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package com.github.jengelman.gradle.plugins.shadow

import com.github.jengelman.gradle.plugins.shadow.ShadowJavaPlugin.Companion.registerShadowJarCommon
import com.github.jengelman.gradle.plugins.shadow.internal.mainClassAttributeKey
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import kotlin.collections.contains
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension

public abstract class ShadowKmpPlugin : Plugin<Project> {
private lateinit var kmpExtension: KotlinMultiplatformExtension

override fun apply(project: Project) {
with(project) {
val kmpExtension = extensions.getByType(KotlinMultiplatformExtension::class.java)
kmpExtension = extensions.getByType(KotlinMultiplatformExtension::class.java)
val kotlinJvmMain = kmpExtension.jvm().compilations.named("main")
registerShadowJarCommon { task ->
task.from(kotlinJvmMain.map { it.output.allOutputs })
Expand All @@ -18,6 +23,22 @@ public abstract class ShadowKmpPlugin : Plugin<Project> {
listOf(configurations.getByName(kotlinJvmMain.get().runtimeDependencyConfigurationName))
},
)
configureMainClass(task)
}
}
}

private fun configureMainClass(task: ShadowJar) {
if (KotlinVersion.CURRENT < KotlinVersion(2, 10, 20)) return

@OptIn(ExperimentalKotlinGradlePluginApi::class)
kmpExtension.jvm().mainRun {
task.inputs.property("mainClassName", mainClass)
task.doFirst {
// Inject the attribute if it is not already present.
if (!task.manifest.attributes.contains(mainClassAttributeKey)) {
task.manifest.attributes[mainClassAttributeKey] = mainClass.get()
}
}
}
}
Expand Down
Loading