AlessioDP / libby

A runtime dependency management library for plugins running in Java-based Minecraft server platforms.
MIT License
76 stars 20 forks source link

[Bukkit] If library is called in onLoad(), a java.lang.NoClassDefFoundError is called #39

Closed Abelkrijgtalles closed 5 months ago

Abelkrijgtalles commented 6 months ago

When (down)loading the library and calling it in onLoad(), java/minecraft throws this nasty error:

[19:56:37 ERROR]: [ModernPluginLoadingStrategy] Could not load plugin 'MojangMaps-1.6-SNAPSHOT.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: java.lang.NoClassDefFoundError: nl/abelkrijgtalles/MojangMaps/lib/dev/jorel/commandapi/CommandAPIConfig
        at io.papermc.paper.plugin.provider.type.spigot.SpigotPluginProvider.createInstance(SpigotPluginProvider.java:127) ~[paper-1.20.4.jar:git-Paper-319]
        at io.papermc.paper.plugin.provider.type.spigot.SpigotPluginProvider.createInstance(SpigotPluginProvider.java:35) ~[paper-1.20.4.jar:git-Paper-319]
        at io.papermc.paper.plugin.entrypoint.strategy.modern.ModernPluginLoadingStrategy.loadProviders(ModernPluginLoadingStrategy.java:116) ~[paper-1.20.4.jar:git-Paper-319]
        at io.papermc.paper.plugin.storage.SimpleProviderStorage.enter(SimpleProviderStorage.java:38) ~[paper-1.20.4.jar:git-Paper-319]
        at io.papermc.paper.plugin.entrypoint.LaunchEntryPointHandler.enter(LaunchEntryPointHandler.java:36) ~[paper-1.20.4.jar:git-Paper-319]
        at org.bukkit.craftbukkit.v1_20_R3.CraftServer.loadPlugins(CraftServer.java:509) ~[paper-1.20.4.jar:git-Paper-319]
        at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:273) ~[paper-1.20.4.jar:git-Paper-319]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1132) ~[paper-1.20.4.jar:git-Paper-319]
        at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:321) ~[paper-1.20.4.jar:git-Paper-319]
        at java.lang.Thread.run(Thread.java:842) ~[?:?]
Caused by: java.lang.NoClassDefFoundError: nl/abelkrijgtalles/MojangMaps/lib/dev/jorel/commandapi/CommandAPIConfig
        at java.lang.Class.forName0(Native Method) ~[?:?]
        at java.lang.Class.forName(Class.java:467) ~[?:?]
        at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:78) ~[paper-api-1.20.4-R0.1-SNAPSHOT.jar:?]
        at io.papermc.paper.plugin.provider.type.spigot.SpigotPluginProvider.createInstance(SpigotPluginProvider.java:123) ~[paper-1.20.4.jar:git-Paper-319]
        ... 9 more
Caused by: java.lang.ClassNotFoundException: nl.abelkrijgtalles.MojangMaps.lib.dev.jorel.commandapi.CommandAPIConfig
        at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:197) ~[paper-api-1.20.4-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:164) ~[paper-api-1.20.4-R0.1-SNAPSHOT.jar:?]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
        at java.lang.Class.forName0(Native Method) ~[?:?]
        at java.lang.Class.forName(Class.java:467) ~[?:?]
        at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:78) ~[paper-api-1.20.4-R0.1-SNAPSHOT.jar:?]
        at io.papermc.paper.plugin.provider.type.spigot.SpigotPluginProvider.createInstance(SpigotPluginProvider.java:123) ~[paper-1.20.4.jar:git-Paper-319]
        ... 9 more

The code that loads the library is this:

public void loadLibs() {

        BukkitLibraryManager libraryManager = new BukkitLibraryManager(this);
        Library jsonLib = Library.builder()
                .groupId("org{}json")
                .artifactId("json")
                .version("20231013")
                .build();
        Library spiguiLib = Library.builder()
                .groupId("com{}samjakob")
                .artifactId("SpiGUI")
                .version("v1.3.1")
                .build();
        Library commandAPILib = Library.builder()
                .groupId("dev{}jorel")
                .artifactId("commandapi-bukkit-shade")
                .version("9.3.0")
                .relocate("dev{}jorel{}commandapi", "nl{}abelkrijgtalles{}MojangMaps{}lib{}commandapi")
                .build();

        libraryManager.addMavenCentral();
        libraryManager.addJitPack();

        libraryManager.loadLibrary(jsonLib);
        libraryManager.loadLibrary(spiguiLib);
        libraryManager.loadLibrary(commandAPILib);

    }

@Override
public void onLoad() {

        loadLibs();

        CommandAPI.onLoad(new CommandAPIBukkitConfig(this));
    }

When disabling the CommandAPI.onLoad(new CommandAPIBukkitConfig(this));, you can see that libby proceeds with (down)loading the libs and just executing normal behaviour.

I seriously don't have any idea how to fix this, other than just letting Mojang Maps (my plugin) manually download the CommandAPI plugin and use commandapi-bukkit-core instead of commandapi-bukkit-shade.

Full code Full log

frengor commented 5 months ago

You need to put the code which uses the CommandAPI into a separate class and use such class only after having loaded the dependencies. This way Java doesn't try to load classes from the CommandAPI before it gets loaded by Libby.

For example:

// Plugin main class
public void loadLibs() {
    // load dependencies
}

@Override
public void onLoad() {
    loadLibs();
    new CommandAPIManager(this).load();
}
// CommandAPIManager.java
public class CommandAPIManager {
    private final JavaPlugin plugin;

    public CommandAPIManager(JavaPlugin plugin) {
        this.plugin = plugin;
    }

    public void load() {
        CommandAPI.onLoad(new CommandAPIBukkitConfig(plugin));
    }
}
Abelkrijgtalles commented 5 months ago

Thank you

Abelkrijgtalles commented 5 months ago

It still doesn't work, @frengor.

Full code

frengor commented 5 months ago

Try moving also these lines into CommandUtil.

Abelkrijgtalles commented 5 months ago

I did fix it, but not on this way. I used the built-in dependency system from spigot. See https://www.spigotmc.org/threads/when-using-libby-in-onload-a-java-lang-noclassdeffounderror-is-called.634222 for the spigot post where I fixed it.