Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WorldArgument fails java.lang.NoClassDefFoundError: org/bukkit/generator/WorldInfo in Minecraft 1.16.5 #397

Closed
JorelAli opened this issue Jan 8, 2023 · 0 comments
Labels
bug Something isn't working

Comments

@JorelAli
Copy link
Owner

JorelAli commented Jan 8, 2023

CommandAPI version

8.7.2

Minecraft version

1.16.5

Are you shading the CommandAPI?

Yes

What I did

Instantiate a WorldArgument in your onEnable() method and run this on a 1.16.5 server:

new WorldArgument();

What actually happened

Fails due to WorldInfo class not existing

[13:34:14 ERROR]: Error occurred while enabling CommandAPI v9.0.0-SNAPSHOT (Is it up to date?)
java.lang.NoClassDefFoundError: org/bukkit/generator/WorldInfo
        at dev.jorel.commandapi.CommandAPIMain.onEnable(CommandAPIMain.java:136) ~[?:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[patched_1.16.5.jar:git-Paper-794]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[patched_1.16.5.jar:git-Paper-794]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:500) ~[patched_1.16.5.jar:git-Paper-794]
        at org.bukkit.craftbukkit.v1_16_R3.CraftServer.enablePlugin(CraftServer.java:518) ~[patched_1.16.5.jar:git-Paper-794]
        at org.bukkit.craftbukkit.v1_16_R3.CraftServer.enablePlugins(CraftServer.java:432) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.loadWorld(MinecraftServer.java:599) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.DedicatedServer.init(DedicatedServer.java:298) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1074) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:291) ~[patched_1.16.5.jar:git-Paper-794]
        at java.lang.Thread.run(Thread.java:833) [?:?]
Caused by: java.lang.ClassNotFoundException: org.bukkit.generator.WorldInfo
        at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:155) ~[patched_1.16.5.jar:git-Paper-794]
        at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:114) ~[patched_1.16.5.jar:git-Paper-794]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
        ... 11 more

What should have happened

Loads normally

Server logs and CommandAPI config

No response

Other

This issue is caused by the method reference lambda in the WorldArgument constructor to convert a World to a String:

((Function<World, String>) World::getName).andThen(String::toLowerCase)

The generated source code:

SourceFile: "WorldArgument.java"
Signature: #88                          // Ldev/jorel/commandapi/arguments/SafeOverrideableArgument<Lorg/bukkit/World;Lorg/bukkit/World;>;
BootstrapMethods:
  0: #96 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
    Method arguments:
      #98 (Ljava/lang/Object;)Ljava/lang/Object;
      #105 REF_invokeInterface org/bukkit/generator/WorldInfo.getName:()Ljava/lang/String;
      #107 (Lorg/bukkit/World;)Ljava/lang/String;
  1: #96 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
    Method arguments:
      #108 (Ljava/lang/Object;)Ljava/lang/Object;
      #114 REF_invokeVirtual java/lang/String.toLowerCase:()Ljava/lang/String;
      #116 (Ljava/lang/String;)Ljava/lang/String;
InnerClasses:
  public static final #122= #118 of #120; // Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles

The generated source code of just using a lambda directly:

world -> world.getName().toLowerCase()
  private static java.lang.String lambda$0(org.bukkit.World);
    descriptor: (Lorg/bukkit/World;)Ljava/lang/String;
    flags: (0x100a) ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokeinterface #81,  1           // InterfaceMethod org/bukkit/World.getName:()Ljava/lang/String;
         6: invokevirtual #85                 // Method java/lang/String.toLowerCase:()Ljava/lang/String;
         9: areturn
      LineNumberTable:
        line 42: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      10     0 world   Lorg/bukkit/World;
}
SourceFile: "WorldArgument.java"
Signature: #94                          // Ldev/jorel/commandapi/arguments/SafeOverrideableArgument<Lorg/bukkit/World;Lorg/bukkit/World;>;
BootstrapMethods:
  0: #102 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
    Method arguments:
      #104 (Ljava/lang/Object;)Ljava/lang/Object;
      #107 REF_invokeStatic dev/jorel/commandapi/arguments/WorldArgument.lambda$0:(Lorg/bukkit/World;)Ljava/lang/String;
      #108 (Lorg/bukkit/World;)Ljava/lang/String;
InnerClasses:
  public static final #114= #110 of #112; // Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles

As you can see, with the method reference it references the WorldInfo class which the World class extends in 1.19.2, but does not extend (or exist) in 1.16.5.

@JorelAli JorelAli added the bug Something isn't working label Jan 8, 2023
JorelAli added a commit that referenced this issue Jan 8, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant