Skip to content

Commit ca11219

Browse files
authored
Generate unique Automatic-Module-Name for metadata JARs (#3109)
Fixes #2901
1 parent afdc830 commit ca11219

File tree

8 files changed

+38
-5
lines changed

8 files changed

+38
-5
lines changed

buildSrc/src/main/kotlin/Java9Modularity.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,4 +241,28 @@ object Java9Modularity {
241241
)
242242
})
243243
}
244+
245+
/**
246+
* For multiplatform Gradle modules, generate and set `Automatic-Module-Name` in metadata JAR's manifest.
247+
*
248+
* Generated automatic (JPMS) module name has the following format:
249+
* `<Gradle module name>. artifact_disambiguating_module`.
250+
*
251+
* For multiplatform projects, a metadata artifact is the one without a platform-specific suffix,
252+
* and it always depends on corresponding `-jvm` artifact (for convenience on build systems other than Gradle).
253+
* For a JVM project depending on such an artifact and using JPMS, it may result in the automatic module name clash
254+
* with a module provided by the `-jvm` artifact. By explicitly setting a non-clashing automatic module name in
255+
* metadata JAR's manifest, we're mitigating this issue.
256+
*/
257+
fun Project.configureMetadataJarAutomaticModuleName() {
258+
val kotlin = extensions.findByType<KotlinMultiplatformExtension>() ?: return
259+
val moduleName = project.name.replace('-', '.') + ".artifact_disambiguating_module"
260+
tasks.withType<Jar>().named(kotlin.metadata().artifactsTaskName) {
261+
manifest {
262+
attributes(
263+
"Automatic-Module-Name" to moduleName,
264+
)
265+
}
266+
}
267+
}
244268
}

core/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Java9Modularity.configureJava9ModuleInfo
2+
import Java9Modularity.configureMetadataJarAutomaticModuleName
23
import org.jetbrains.kotlin.gradle.targets.js.ir.*
34

45
/*
@@ -69,6 +70,7 @@ tasks.withType<Jar>().named(kotlin.jvm().artifactsTaskName) {
6970
}
7071

7172
configureJava9ModuleInfo()
73+
configureMetadataJarAutomaticModuleName()
7274

7375
tasks.withType<KotlinJsIrLink>().configureEach {
7476
compilerOptions.freeCompilerArgs.add("-Xwasm-enable-array-range-checks")

formats/cbor/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Java9Modularity.configureJava9ModuleInfo
2+
import Java9Modularity.configureMetadataJarAutomaticModuleName
23

34
/*
45
* Copyright 2017-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
@@ -36,3 +37,4 @@ kotlin {
3637
}
3738

3839
configureJava9ModuleInfo()
40+
configureMetadataJarAutomaticModuleName()

formats/json-io/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
* Copyright 2017-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
33
*/
44
import Java9Modularity.configureJava9ModuleInfo
5-
import org.jetbrains.dokka.gradle.*
6-
import java.net.*
5+
import Java9Modularity.configureMetadataJarAutomaticModuleName
76

87
plugins {
98
kotlin("multiplatform")
@@ -32,6 +31,7 @@ kotlin {
3231
}
3332

3433
project.configureJava9ModuleInfo()
34+
project.configureMetadataJarAutomaticModuleName()
3535

3636
dokka.dokkaSourceSets.configureEach {
3737
externalDocumentationLinks.register("kotlinx-io") {

formats/json-okio/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
* Copyright 2017-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
33
*/
44
import Java9Modularity.configureJava9ModuleInfo
5-
import org.jetbrains.dokka.gradle.*
6-
import java.net.*
5+
import Java9Modularity.configureMetadataJarAutomaticModuleName
76

87
plugins {
98
kotlin("multiplatform")
@@ -33,6 +32,7 @@ kotlin {
3332
}
3433

3534
project.configureJava9ModuleInfo()
35+
project.configureMetadataJarAutomaticModuleName()
3636

3737
dokka.dokkaSourceSets.configureEach {
3838
externalDocumentationLinks.register("okio") {

formats/json/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Java9Modularity.configureJava9ModuleInfo
2-
import org.jetbrains.kotlin.gradle.tasks.*
2+
import Java9Modularity.configureMetadataJarAutomaticModuleName
33

44
/*
55
* Copyright 2017-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
@@ -53,3 +53,4 @@ kotlin {
5353
}
5454

5555
configureJava9ModuleInfo()
56+
configureMetadataJarAutomaticModuleName()

formats/properties/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Java9Modularity.configureJava9ModuleInfo
2+
import Java9Modularity.configureMetadataJarAutomaticModuleName
23

34
/*
45
* Copyright 2017-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
@@ -36,3 +37,4 @@ kotlin {
3637
}
3738

3839
configureJava9ModuleInfo()
40+
configureMetadataJarAutomaticModuleName()

formats/protobuf/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Copyright 2017-2024 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
33
*/
44
import Java9Modularity.configureJava9ModuleInfo
5+
import Java9Modularity.configureMetadataJarAutomaticModuleName
56

67
plugins {
78
kotlin("multiplatform")
@@ -34,3 +35,4 @@ kotlin {
3435
}
3536

3637
configureJava9ModuleInfo()
38+
configureMetadataJarAutomaticModuleName()

0 commit comments

Comments
 (0)