Uploaded image for project: 'Spigot'
  1. Spigot
  2. SPIGOT-6298

Plugin objects are constructed out of order prior to dependency resolution

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Minor Minor
    • None
    • None
    • CentOS 7

    • git-Spigot-628435a-b5e5adc
    • Yes

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

       
      I've updated Spigot to the latest 1.16.4.

            Unassigned Unassigned
            Zhro Matt D.
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: