代码之家  ›  专栏  ›  技术社区  ›  FoamyGuy

Minecraft插件ClassNotFound外部JAR错误

  •  0
  • FoamyGuy  · 技术社区  · 3 年前

    我正在尝试为Minecraft插口服务器构建一个插件,最终我希望能够通过串行方式与连接到我的PC的东西进行通信(服务器也在PC上本地运行)。

    我已经能够构建和运行插件,并在游戏中操纵玩家/区块,因此我知道基本插件的构建过程正在运行。当我开始尝试包含一个额外的依赖项时,我的问题就开始了: jSerialComm

    <dependency>
        <groupId>com.fazecast</groupId>
        <artifactId>jSerialComm</artifactId>
        <version>[2.0.0,3.0.0)</version>
        <scope>provided</scope>
    </dependency>
    

    我添加了一些基本代码从中导入类 并在我的插件中的命令中对它们执行一些基本操作:

    import com.fazecast.jSerialComm.SerialPort;
    
    public class CommandCheck implements CommandExecutor {
    
        @Override
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
            if (sender instanceof Player){
                System.out.println(SerialPort.getCommPorts());
            }
            return false;
        }
    }
    

    这构建得很好,我使用的是InteliJ,它可以识别SerialPort类(没有红色下划线)。

    org.bukkit.command.CommandException: Unhandled exception executing command 'check' in plugin MyFirstPlugin v1.0-SNAPSHOT
            at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?]
            at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:149) ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?]
            at org.bukkit.craftbukkit.v1_18_R1.CraftServer.dispatchCommand(CraftServer.java:821) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.server.network.PlayerConnection.a(PlayerConnection.java:1939) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.server.network.PlayerConnection.a(PlayerConnection.java:1778) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.server.network.PlayerConnection.a(PlayerConnection.java:1759) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.network.protocol.game.PacketPlayInChat.a(PacketPlayInChat.java:46) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.network.protocol.game.PacketPlayInChat.a(PacketPlayInChat.java:1) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.network.protocol.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:30) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.server.TickTask.run(SourceFile:18) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.util.thread.IAsyncTaskHandler.c(SourceFile:151) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.util.thread.IAsyncTaskHandlerReentrant.c(SourceFile:23) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.server.MinecraftServer.b(MinecraftServer.java:1158) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.server.MinecraftServer.c(MinecraftServer.java:1) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.util.thread.IAsyncTaskHandler.y(SourceFile:125) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.server.MinecraftServer.bf(MinecraftServer.java:1137) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.server.MinecraftServer.y(MinecraftServer.java:1130) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.util.thread.IAsyncTaskHandler.c(SourceFile:134) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.server.MinecraftServer.x(MinecraftServer.java:1114) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:1038) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at net.minecraft.server.MinecraftServer.lambda$0(MinecraftServer.java:304) ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3380-Spigot-8965a50-0ba6b90]
            at java.lang.Thread.run(Thread.java:833) [?:?]
    Caused by: java.lang.NoClassDefFoundError: com/fazecast/jSerialComm/SerialPort
            at com.foamyguy.myfirstplugin.CommandCheck.onCommand(CommandCheck.java:21) ~[?:?]
            at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?]
            ... 21 more
    Caused by: java.lang.ClassNotFoundException: com.fazecast.jSerialComm.SerialPort
            at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:147) ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?]
            at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:99) ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?]
            at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
            at com.foamyguy.myfirstplugin.CommandCheck.onCommand(CommandCheck.java:21) ~[?:?]
            at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?]
            ... 21 more
    

    unzipped jar contents

    为了从Minecraft插件内部成功地使用外部JAR文件(特别是jSerialComm),我需要做什么?或者,是否有一些内置的方式,我可以通过串行端口连接和通信,而不需要外部JAR,因此不需要任何“特殊”的东西来工作?

    1 回复  |  直到 3 年前
        1
  •  1
  •   Daniel    3 年前

    即使JAR存在于插件中,JAR的类也不会加载到类路径中,spiget也无法访问这些类。

    您可以使用插件,例如 maven-shade-plugin ,它将所有类从API-JAR复制到插件JAR。

    provided compile .

    <dependency>
        <groupId>com.fazecast</groupId>
        <artifactId>jSerialComm</artifactId>
        <version>[2.0.0,3.0.0)</version>
        <scope>compile</scope> <!-- -->
    </dependency>
    

    maven-shade-plugin build > plugins 在你的内心 pom.xml

    <build>
        <!-- ... -->
        <plugins>
          <!-- ... -->
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <!-- ... -->
        </plugins>
        <!-- ... -->
      </build>
    

    如果您现在构建jar(使用。 man clean package ),目标/文件夹中应该有一个“fat-”jar文件,其中包含API的类以及您的类。

    之前插件的内容:

    ├ com
      ├ foamguy
        └ myfirstplugin
          └ ...
    ├ plugin.yml
    └ jSerialComm-xxx.jar
    

    您的插件在以下情况下的内容:

    ├ com
      ├ foamguy
        └ myfirstplugin
          └ ...
      └ fazecast
        └ jSerialComm
          └ ...
    └ plugin.yml