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

 
I've updated Spigot to the latest 1.16.4.



 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.

Generated at Wed Apr 02 10:57:39 UTC 2025 using Jira 10.3.3#10030003-sha1:d220e3fefc8dfc6d47f522d3b9a20c1455e12b7b.