ScalaLoader not working with Paper 1.21.1 - 56
Hello
ScalaLoader doesn't load with Paper 1.21.1 - 56, I have the following error
[17:36:11] [Server thread/ERROR]: [ScalaLoader] Error initializing plugin 'ScalaLoader-0.18.13-SNAPSHOT.jar' in folder 'plugins' (Is it up to date?)
java.lang.NoSuchFieldError: Class xyz.janboerman.scalaloader.paper.plugin.ScalaPluginClassLoader does not have member field 'io.papermc.paper.plugin.provider.configuration.PaperPluginMeta configuration'
at ScalaLoader-0.18.13-SNAPSHOT.jar/xyz.janboerman.scalaloader.paper.plugin.ScalaPluginClassLoader.transformBytecode(ScalaPluginClassLoader.java:239) ~[ScalaLoader-0.18.13-SNAPSHOT.jar:?]
at ScalaLoader-0.18.13-SNAPSHOT.jar/xyz.janboerman.scalaloader.paper.plugin.ScalaPluginClassLoader.findClass(ScalaPluginClassLoader.java:190) ~[ScalaLoader-0.18.13-SNAPSHOT.jar:?]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593) ~[?:?]
at io.papermc.paper.plugin.entrypoint.classloader.PaperPluginClassLoader.loadClass(PaperPluginClassLoader.java:118) ~[paper-1.21.1.jar:1.21.1-56-227c94a]
at io.papermc.paper.plugin.entrypoint.classloader.PaperPluginClassLoader.loadClass(PaperPluginClassLoader.java:107) ~[paper-1.21.1.jar:1.21.1-56-227c94a]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?]
at java.base/java.lang.Class.forName0(Native Method) ~[?:?]
at java.base/java.lang.Class.forName(Class.java:534) ~[?:?]
at java.base/java.lang.Class.forName(Class.java:513) ~[?:?]
at ScalaLoader-0.18.13-SNAPSHOT.jar/xyz.janboerman.scalaloader.paper.plugin.ScalaPluginBootstrap.createPlugin(ScalaPluginBootstrap.java:43) ~[ScalaLoader-0.18.13-SNAPSHOT.jar:?]
at ScalaLoader-0.18.13-SNAPSHOT.jar/xyz.janboerman.scalaloader.paper.plugin.ScalaPluginBootstrap.createPlugin(ScalaPluginBootstrap.java:16) ~[ScalaLoader-0.18.13-SNAPSHOT.jar:?]
at ScalaLoader-0.18.13-SNAPSHOT.jar/xyz.janboerman.scalaloader.paper.ScalaLoader.buildPlugin(ScalaLoader.java:578) ~[ScalaLoader-0.18.13-SNAPSHOT.jar:?]
at ScalaLoader-0.18.13-SNAPSHOT.jar/xyz.janboerman.scalaloader.paper.ScalaLoader.loadScalaPlugins(ScalaLoader.java:328) ~[ScalaLoader-0.18.13-SNAPSHOT.jar:?]
at ScalaLoader-0.18.13-SNAPSHOT.jar/xyz.janboerman.scalaloader.paper.ScalaLoader.loadScalaPlugins(ScalaLoader.java:203) ~[ScalaLoader-0.18.13-SNAPSHOT.jar:?]
at ScalaLoader-0.18.13-SNAPSHOT.jar/xyz.janboerman.scalaloader.paper.ScalaLoader.onLoad(ScalaLoader.java:165) ~[ScalaLoader-0.18.13-SNAPSHOT.jar:?]
at io.papermc.paper.plugin.storage.ServerPluginProviderStorage.processProvided(ServerPluginProviderStorage.java:59) ~[paper-1.21.1.jar:1.21.1-56-227c94a]
at io.papermc.paper.plugin.storage.ServerPluginProviderStorage.processProvided(ServerPluginProviderStorage.java:18) ~[paper-1.21.1.jar:1.21.1-56-227c94a]
at io.papermc.paper.plugin.storage.SimpleProviderStorage.enter(SimpleProviderStorage.java:39) ~[paper-1.21.1.jar:1.21.1-56-227c94a]
at io.papermc.paper.plugin.entrypoint.LaunchEntryPointHandler.enter(LaunchEntryPointHandler.java:40) ~[paper-1.21.1.jar:1.21.1-56-227c94a]
at org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:546) ~[paper-1.21.1.jar:1.21.1-56-227c94a]
at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:292) ~[paper-1.21.1.jar:1.21.1-56-227c94a]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1215) ~[paper-1.21.1.jar:1.21.1-56-227c94a]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:330) ~[paper-1.21.1.jar:1.21.1-56-227c94a]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]
Can you examine this bug ?
Thanks a lot
Yes, I can. It'll have to wait for next monday.
I found the culprit: https://github.com/PaperMC/Paper/pull/10758/files#diff-1b48bde36fde990048ba454fb0bcc4e2b92a441c8387c350f1a8f0f09dbc8f8eR1127 so I hope to land a fix tonight.
I don't really understand how the PR change the behavior but it's good to know that you found the issue, good luck for your fix :)
They made a bytecode-incompatible change. ScalaLoader uses this PluginMeta configuration field directly (actually, it used the PaperPluginMeta type); so in ScalaLoader's bytecode there is a getfield instruction which includes the name and type of that field. If the type is not exactly the same, it's considered a different field. I have found a workaround for this problem now: accessing the field using a getter method handle. I did run into some other issue to; bytecode transformations in CraftBukkit changed - ScalaLoader will have to adapt so that ScalaPlugins which use org.bukkit.Material will work properly again (one of my test plugins threw an assertion error because it found both modern and legacy materials).
https://github.com/Jannyboy11/ScalaPluginLoader/tree/fix/paper-1.21.1 contains the fixes, but still contains some debug statements. I will make a proper release tomorrow because I don't have any more time today.
https://www.spigotmc.org/resources/scalaloader.59568/update?update=561361
Thank you for the fix !