[SPIGOT-6298] Plugin objects are constructed out of order prior to dependency resolution Created: 29/Dec/20 Updated: 11/Jan/21 |
|
Status: | Open |
Project: | Spigot |
Component/s: | None |
Affects Version/s: | None |
Fix Version/s: | None |
Type: | Bug | Priority: | Minor |
Reporter: | Matt D. | Assignee: | Unassigned |
Resolution: | Unresolved | Votes: | 0 |
Labels: | bug, spigot | ||
Environment: |
CentOS 7 |
Version: | git-Spigot-628435a-b5e5adc |
Guidelines Read: | Yes |
Description |
I'm writing a new permissions plugin with plugin.yml: name: ZAdminPermissions main: com.codespunk.zadmin.permission.plugin.bukkit.ZAdminPermissions depend: [ ZAdminLibUtil, ZAdminLibBukkit ] It depends on ZAdminLibUtil: name: ZAdminLibUtil main: com.codespunk.zadmin.lib.util.plugin.bukkit.ZAdminLibUtil depend: [] And ZAdminLibBukkit: name: ZAdminLibBukkit main: com.codespunk.zadmin.lib.bukkit.plugin.bukkit.ZAdminLibBukkit depend: [ ZAdminLibUtil ] The permissions plugin is trying to load before its dependencies. See that ZAdminLibUtil and ZAdminLibBukkit load successfully later in the log: 2020-12-28 22:52:41 [ERROR] Could not load 'plugins/ZAdminPermissions.jar' in folder 'plugins' org.bukkit.plugin.InvalidPluginException: java.lang.NoSuchMethodError: 'com.codespunk.zadmin.lib.bukkit.BukkitResource com.codespunk.zadmin.lib.bukki t.BukkitResource.load(com.codespunk.zadmin.lib.bukkit.BukkitPlugin, java.lang.String)' at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:139) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:394) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:301) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at org.bukkit.craftbukkit.v1_16_R3.CraftServer.loadPlugins(CraftServer.java:383) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at net.minecraft.server.v1_16_R3.DedicatedServer.init(DedicatedServer.java:185) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:809) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$0(MinecraftServer.java:164) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at java.lang.Thread.run(Thread.java:832) [?:?] Caused by: java.lang.NoSuchMethodError: 'com.codespunk.zadmin.lib.bukkit.BukkitResource com.codespunk.zadmin.lib.bukkit.BukkitResource.load(com.codespunk.zadmin.lib.bukkit.BukkitPlugin, java.lang.String)' at com.codespunk.zadmin.permission.local.alias.Resource.load(Resource.java:42) ~[?:?] at com.codespunk.zadmin.permission.plugin.bukkit.ThisPlugin.<init>(ThisPlugin.java:36) ~[?:?] at com.codespunk.zadmin.permission.plugin.bukkit.ZAdminPermissions.<init>(ZAdminPermissions.java:14) ~[?:?] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64) ~[?:?] at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?] at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) ~[?:?] at java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) ~[?:?] at jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:350) ~[?:?] at java.lang.Class.newInstance(Class.java:645) ~[?:?] at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:76) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:135) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] ... 7 more 2020-12-28 22:52:41 [INFO] [ZAdminLibUtil] Loading ZAdminLibUtil v1.0 2020-12-28 22:52:41 [INFO] [ZAdminLibBungeeCord] Loading ZAdminLibBungeeCord v1.0 2020-12-28 22:52:41 [INFO] [ZAdminLibBukkit] Loading ZAdminLibBukkit v1.0 2020-12-28 22:52:41 [INFO] [ZAdminHome] Loading ZAdminHome v1.0 I can confirm that Spigot is reading the contained plugin.yml because if I remove it I get a different error: 2020-12-29 01:42:59 [ERROR] Could not load 'plugins/ZAdminPermissions.jar' in folder 'plugins' org.bukkit.plugin.InvalidDescriptionException: Invalid plugin.yml at org.bukkit.plugin.java.JavaPluginLoader.getPluginDescription(JavaPluginLoader.java:160) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:144) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at org.bukkit.craftbukkit.v1_16_R3.CraftServer.loadPlugins(CraftServer.java:383) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at net.minecraft.server.v1_16_R3.DedicatedServer.init(DedicatedServer.java:185) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:809) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$0(MinecraftServer.java:164) ~[spigot-1.16.4.jar:git-Spigot-a19903d-5b74714] at java.lang.Thread.run(Thread.java:832) [?:?] Caused by: java.io.FileNotFoundException: Jar does not contain plugin.yml ... 7 more Spigot appears to be calling the constructor and the static initializer prior to handling dependency resolution. // This import is located in a dependency import com.codespunk.zadmin.lib.bukkit.Resource; public class Plugin extends JavaPlugin { private final Config _config; public Plugin() { // Resource is an class from another plugin Resource config = Resource.fromJar(this, "config.yml"); } } I can't do this either. // This import is located in a dependency import com.codespunk.zadmin.lib.bukkit.Resource; public class Plugin extends JavaPlugin { static { // Resource is an class from another plugin Resource config = Resource.fromJar(null, "config.yml"); } } |
Comments |
Comment by md_5 [ 11/Jan/21 ] |
I'm not convinced your plugin.ymls are correct. Please include the plugins or the minimal versions to reproduce. |
Comment by Matt D. [ 29/Dec/20 ] |
I can't move code that can only run in the static initializer. Moving code from the constructor also gives me a race condition when trying to interact with certain objects through Bungeecord as they may not be constructed correctly. I have exceptions that raise in the constructor to prevent this but they aren't evaluated if the onLoad() methods haven't been called yet. |
Comment by Black Hole [ 29/Dec/20 ] |
As a workaround you could move all code that depend on the loading of other plugins to the onLoad() method. |