Skip to content

Commit 93f2765

Browse files
authored
Generate version provider into module-specific package (#1219)
The GeneratedVersionProvider was being generated into the shared versionspi package in every module, causing duplicate class conflicts. Generate it into each module's own package instead so every JAR has a unique FQCN.
1 parent 8284d5f commit 93f2765

1 file changed

Lines changed: 18 additions & 6 deletions

File tree

buildSrc/src/main/kotlin/GenerateVersionProviderTask.kt

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import java.io.File
66

77
/**
88
* Gradle task that generates a SmithyVersionProvider SPI implementation for a module.
9+
*
10+
* The implementation is generated into the module's own package to avoid classpath
11+
* conflicts when multiple modules are on the classpath.
912
*/
1013
abstract class GenerateVersionProviderTask : DefaultTask() {
1114

@@ -19,7 +22,7 @@ abstract class GenerateVersionProviderTask : DefaultTask() {
1922
var outputDir: File = project.layout.buildDirectory.dir("generated/version-provider").get().asFile
2023

2124
companion object {
22-
private const val PACKAGE = "software.amazon.smithy.java.versionspi"
25+
private const val SPI_PACKAGE = "software.amazon.smithy.java.versionspi"
2326
private const val INTERFACE_NAME = "SmithyVersionProvider"
2427
private const val RECORD_NAME = "ModuleVersion"
2528
private const val IMPL_NAME = "GeneratedVersionProvider"
@@ -32,13 +35,22 @@ abstract class GenerateVersionProviderTask : DefaultTask() {
3235
val minor = parts.getOrElse(1) { "0" }
3336
val patch = parts.getOrElse(2) { "0" }.replace(Regex("[^0-9].*"), "")
3437

35-
val packageDir = File(outputDir, "java/${PACKAGE.replace('.', '/')}")
38+
// Use the module's own package for the implementation class
39+
val implPackage = moduleName
40+
val packageDir = File(outputDir, "java/${implPackage.replace('.', '/')}")
3641
packageDir.mkdirs()
3742

38-
// Generate the implementation
43+
val fqInterface = "$SPI_PACKAGE.$INTERFACE_NAME"
44+
val fqRecord = "$SPI_PACKAGE.$RECORD_NAME"
45+
val fqImpl = "$implPackage.$IMPL_NAME"
46+
47+
// Generate the implementation in the module's own package
3948
File(packageDir, "$IMPL_NAME.java").writeText(
4049
"""
41-
|package $PACKAGE;
50+
|package $implPackage;
51+
|
52+
|import $fqInterface;
53+
|import $fqRecord;
4254
|
4355
|public final class $IMPL_NAME implements $INTERFACE_NAME {
4456
| private static final $RECORD_NAME VERSION = new $RECORD_NAME("$moduleName", $major, $minor, $patch);
@@ -54,8 +66,8 @@ abstract class GenerateVersionProviderTask : DefaultTask() {
5466
// Generate META-INF/services file
5567
val servicesDir = File(outputDir, "resources/META-INF/services")
5668
servicesDir.mkdirs()
57-
File(servicesDir, "$PACKAGE.$INTERFACE_NAME").writeText(
58-
"$PACKAGE.$IMPL_NAME\n"
69+
File(servicesDir, fqInterface).writeText(
70+
"$fqImpl\n"
5971
)
6072
}
6173
}

0 commit comments

Comments
 (0)