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(); }