Skip to content

Fix crash caused by accessing registry too early - #887

Merged
Dreeam-qwq merged 3 commits into
ver/26.2from
fix/max-stack-size-cache-crash
Aug 18, 2026
Merged

Fix crash caused by accessing registry too early#887
Dreeam-qwq merged 3 commits into
ver/26.2from
fix/max-stack-size-cache-crash

Conversation

@Dreeam-qwq

@Dreeam-qwq Dreeam-qwq commented Aug 18, 2026

Copy link
Copy Markdown
Member

Another crash related to class init sequence. Very beautiful! Very powerful!

Issue analysis

Some plugins/libs may use Class.forName to check classes (cloud command framework in this issue.).

Plugin calls`Class.forName("...ItemStack")`
└─ Init `ItemStack` static fields
   └─ Init `ItemStack.EMPTY`
      └─ Init `PatchedDataComponentMap`
         └─ `detectMaxStackSizeChange()`  <- Leaf/Leaves's change!
            └─ `getOrDefault(DataComponents.MAX_STACK_SIZE, 1)`
               └─ Init `DataComponents` static fields
                  └─ Init `DataComponents#MOOSHROOM_VARIANT`
                     └─ Init `MushroomCow.Variant`
                        └─ idk what happened below it, a crash happened

The plugin EasyArmorStands uses Paper's lifecycle API, and init the cloud framework at Paper's bootstrap stage (actually it's before Minecraft's bootstrap). So it triggers the max stack size cache logic to access a registry (maybe I guess) before the registries are initialized, and causes ExceptionInInitializerError in the end.

So I just rewrote the PatchedDataComponentMap constructor for ItemStack#EMPTY, skipped detectMaxStackSizeChange and to prevent adding more conditions in detectMaxStackSizeChange. If you have a better solution, let me know (
Yes, now it's a better approach

Error

Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.ExceptionInInitializerError [in thread "ServerMain"]
        at net.minecraft.world.entity.animal.cow.MushroomCow$Variant.<clinit>(MushroomCow.java:341)
        at net.minecraft.core.component.DataComponents.lambda$static$92(DataComponents.java:363)
        at net.minecraft.core.component.DataComponents.register(DataComponents.java:438)
        at net.minecraft.core.component.DataComponents.<clinit>(DataComponents.java:362)
        at net.minecraft.core.component.PatchedDataComponentMap.detectMaxStackSizeChange(PatchedDataComponentMap.java:286)
        at net.minecraft.core.component.PatchedDataComponentMap.<init>(PatchedDataComponentMap.java:34)
        at net.minecraft.core.component.PatchedDataComponentMap.<init>(PatchedDataComponentMap.java:25)
        at net.minecraft.world.item.ItemStack.<init>(ItemStack.java:285)
        at net.minecraft.world.item.ItemStack.<clinit>(ItemStack.java:152)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:467)
        at java.base/java.lang.Class.forName(Class.java:458)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.lib.cloud.bukkit.internal.CraftBukkitReflection.findClass(CraftBukkitReflection.java:194)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:214)
        at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:1024)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:635)
        at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:291)
        at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:652)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.lib.cloud.bukkit.internal.CraftBukkitReflection.needNMSClassOrElse(CraftBukkitReflection.java:156)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.lib.cloud.bukkit.parser.ItemStackParser$ModernParser.<clinit>(ItemStackParser.java:143)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.lib.cloud.bukkit.parser.ItemStackParser.<init>(ItemStackParser.java:121)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.lib.cloud.bukkit.parser.ItemStackParser.itemStackParser(ItemStackParser.java:83)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.lib.cloud.bukkit.BukkitParsers.register(BukkitParsers.java:75)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.lib.cloud.paper.PaperCommandManager.<init>(PaperCommandManager.java:109)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.lib.cloud.paper.PaperCommandManager.<init>(PaperCommandManager.java:65)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.lib.cloud.paper.PaperCommandManager$Bootstrapped.<init>(PaperCommandManager.java:187)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.lib.cloud.paper.PaperCommandManager$Bootstrapped.<init>(PaperCommandManager.java:181)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.lib.cloud.paper.PaperCommandManager$CoordinatedBuilder.buildBootstrapped(PaperCommandManager.java:271)
        at EasyArmorStands-3.4.0-SNAPSHOT.jar//me.m56738.easyarmorstands.EasyArmorStandsBootstrap.bootstrap(EasyArmorStandsBootstrap.java:74)
        at io.papermc.paper.plugin.storage.BootstrapProviderStorage$1.load(BootstrapProviderStorage.java:36)
        at io.papermc.paper.plugin.storage.BootstrapProviderStorage$1.load(BootstrapProviderStorage.java:24)
        at io.papermc.paper.plugin.entrypoint.strategy.modern.ModernPluginLoadingStrategy.loadProviders(ModernPluginLoadingStrategy.java:117)
        at io.papermc.paper.plugin.storage.SimpleProviderStorage.enter(SimpleProviderStorage.java:38)
        at io.papermc.paper.plugin.entrypoint.LaunchEntryPointHandler.enter(LaunchEntryPointHandler.java:39)
        at io.papermc.paper.plugin.entrypoint.LaunchEntryPointHandler.enterBootstrappers(LaunchEntryPointHandler.java:29)
        at net.minecraft.server.Bootstrap.bootStrap(Bootstrap.java:47)
        at net.minecraft.server.Main.main(Main.java:123)
        at io.papermc.paper.PaperBootstrap.boot(PaperBootstrap.java:25)
        at org.bukkit.craftbukkit.Main.main(Main.java:212)
        at cn.dreeam.leaper.QuantumLeaper.lambda$main$0(QuantumLeaper.java:51)
        at java.base/java.lang.Thread.run(Thread.java:1474)

@Dreeam-qwq
Dreeam-qwq requested a review from HaHaWTH August 18, 2026 07:22
@Dreeam-qwq Dreeam-qwq added the type: fix Pull request for fixing bug label Aug 18, 2026
@Dreeam-qwq
Dreeam-qwq marked this pull request as ready for review August 18, 2026 07:23
Thanks to Lumine!!!
@Dreeam-qwq
Dreeam-qwq force-pushed the fix/max-stack-size-cache-crash branch from b18bd22 to b6aa363 Compare August 18, 2026 08:17

@HaHaWTH HaHaWTH left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

waffle le

@Dreeam-qwq
Dreeam-qwq merged commit 693a2b5 into ver/26.2 Aug 18, 2026
2 checks passed
@Dreeam-qwq
Dreeam-qwq deleted the fix/max-stack-size-cache-crash branch August 18, 2026 22:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type: fix Pull request for fixing bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants