From 8183cc4d57c8090ffb1d2714afe8c3824e63fa0b Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 30 Jan 2026 11:04:50 +0100 Subject: [PATCH] stage2/ml9: Fix merging of provided services into KFF With kotlinx-metadata-jvm being promoted to stable in Kotlin 2.0, the kotlin-reflect library now relies on a new service ([1]), the services file for which wasn't yet present in older KFF versions. And with the Java module system, which ModLauncher uses, merely merging the service file from the newer Kotlin isn't enough, we also need to merge them into KFF's module descriptor. [1]: https://github.com/JetBrains/kotlin/blob/4c61b7118f23a090a764a3aa07e4291e50210771/libraries/kotlinx-metadata/jvm/resources/META-INF/services/kotlin.metadata.internal.extensions.MetadataExtensions --- .../stage2/DescriptorRewritingJarMetadata.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/stage2/modlauncher9/src/main/java/gg/essential/loader/stage2/DescriptorRewritingJarMetadata.java b/stage2/modlauncher9/src/main/java/gg/essential/loader/stage2/DescriptorRewritingJarMetadata.java index b562d2b..3cc65bd 100644 --- a/stage2/modlauncher9/src/main/java/gg/essential/loader/stage2/DescriptorRewritingJarMetadata.java +++ b/stage2/modlauncher9/src/main/java/gg/essential/loader/stage2/DescriptorRewritingJarMetadata.java @@ -6,12 +6,17 @@ import gg.essential.loader.stage2.util.Lazy; import java.lang.module.ModuleDescriptor; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * Re-creates the {@link #descriptor()} with an updated {@link SecureJar#getPackages() package list}. * This is needed when one adds classes (even internal ones) to a {@link SecureJar} in previously non-existent packages * because the module system needs to know about all packages because ModLauncher will use that package list to build * a lookup table. + * Also updates the provided services with the ones from the new meta. */ public class DescriptorRewritingJarMetadata implements JarMetadata { private final JarMetadata delegate; @@ -47,7 +52,13 @@ public ModuleDescriptor descriptor() { } org.uses().forEach(builder::uses); } - org.provides().forEach(builder::provides); + Map> orgProvides = org.provides() + .stream().collect(Collectors.toMap(ModuleDescriptor.Provides::service, ModuleDescriptor.Provides::providers)); + Map> newProvides = newPkgsMeta.descriptor().provides() + .stream().collect(Collectors.toMap(ModuleDescriptor.Provides::service, ModuleDescriptor.Provides::providers)); + Map> mergedProvides = new HashMap<>(orgProvides); + mergedProvides.putAll(newProvides); + mergedProvides.forEach(builder::provides); org.mainClass().ifPresent(builder::mainClass); this.descriptor = builder.build(); }