使用 IntelliJ 引用 jar 库导致 ClassNotFoundException
Reference to a jar lib results in ClassNotFoundException with IntelliJ
我正在为 minecraft 编译一个插件,基本上是在登录时播放一首歌曲。
可以找到源代码 here.
一个插件已经存在,它为媒体播放器提供了我遵循的教程MC_Jukebox, source code is here
我的代码使用这个外部 jar 来完成这项工作:
package com.iqbrod.excilysplugin;
import net.mcjukebox.plugin.bukkit.api.JukeboxAPI;
import net.mcjukebox.plugin.bukkit.api.ResourceType;
import net.mcjukebox.plugin.bukkit.api.models.Media;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
public class LoginListener implements Listener {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Media media = new Media(ResourceType.MUSIC, "https://od.lk/s/MTFfMjQ2ODM2NTRf/music1.mp3");
JukeboxAPI.play(event.getPlayer(), media);
}
}
此代码正确,应在 PlayerJoinEvent
上播放音乐。
我的问题来自对 jar 的编译,其中包含:
com/* #Source code
lib/* #external Jars (MC_Jukebox)
plugin.yml #required by Minecraft Server
META-INF/MANIFEST.MF #details below
源代码 com/*
是基本的 Java,与现有 plugins/code 相比是正确的。 Lib
包含我的库 jar。 plugin.yml
是正确的并且在没有对 lib 类 的引用的情况下工作。 MANIFEST.MF
是
Manifest-Version: 1.0
Main-Class: EntryPoint
Class-Path: lib/
问题
即使在 Class 中引用 lib
- MANIFEST
运行 服务器和客户端的路径也会导致
[13:26:27] [Server thread/ERROR]: Could not pass event PlayerJoinEvent to ExcilysPlugin v1.0 org.bukkit.event.EventException: null
(...)
Caused by: java.lang.NoClassDefFoundError: net/mcjukebox/plugin/bukkit/api/models/Media
(...)
Caused by: java.lang.ClassNotFoundException: net.mcjukebox.plugin.bukkit.api.models.Media
如何在文件夹 lib
下引用我的 jar 中包含的 jar?
我正在使用 Intellij 进行编码和编译。
我读了这个 post 并尝试使用 "Extract Folder".
两者都会导致 ClassNotFoundException。
在您的情况下,您必须在服务器上安装 McJukebox 插件,运行 您自己的自定义插件。我想否则,您的插件将无法工作。一般来说,导出包含插件所需 类 的 source/jar 文件就足够了。您也可以 load jars through a function.
MANIFEST 中的 jars 引用指向本地目录 (.minecraft/plugins/
) 而不是源代码。
解决这个问题: 我的外部 jar 在 .minecraft/plugins/lib
而不是 .minecraft/plugins/myplugin/lib
.
另一种解决方案是将 MANIFEST.mf
中的这些罐子指向
ClassPath: myplugin/lib
我正在为 minecraft 编译一个插件,基本上是在登录时播放一首歌曲。 可以找到源代码 here.
一个插件已经存在,它为媒体播放器提供了我遵循的教程MC_Jukebox, source code is here
我的代码使用这个外部 jar 来完成这项工作:
package com.iqbrod.excilysplugin;
import net.mcjukebox.plugin.bukkit.api.JukeboxAPI;
import net.mcjukebox.plugin.bukkit.api.ResourceType;
import net.mcjukebox.plugin.bukkit.api.models.Media;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
public class LoginListener implements Listener {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Media media = new Media(ResourceType.MUSIC, "https://od.lk/s/MTFfMjQ2ODM2NTRf/music1.mp3");
JukeboxAPI.play(event.getPlayer(), media);
}
}
此代码正确,应在 PlayerJoinEvent
上播放音乐。
我的问题来自对 jar 的编译,其中包含:
com/* #Source code
lib/* #external Jars (MC_Jukebox)
plugin.yml #required by Minecraft Server
META-INF/MANIFEST.MF #details below
源代码 com/*
是基本的 Java,与现有 plugins/code 相比是正确的。 Lib
包含我的库 jar。 plugin.yml
是正确的并且在没有对 lib 类 的引用的情况下工作。 MANIFEST.MF
是
Manifest-Version: 1.0
Main-Class: EntryPoint
Class-Path: lib/
问题
即使在 Class 中引用 lib
- MANIFEST
运行 服务器和客户端的路径也会导致
[13:26:27] [Server thread/ERROR]: Could not pass event PlayerJoinEvent to ExcilysPlugin v1.0 org.bukkit.event.EventException: null
(...)
Caused by: java.lang.NoClassDefFoundError: net/mcjukebox/plugin/bukkit/api/models/Media
(...)
Caused by: java.lang.ClassNotFoundException: net.mcjukebox.plugin.bukkit.api.models.Media
如何在文件夹 lib
下引用我的 jar 中包含的 jar?
我正在使用 Intellij 进行编码和编译。
我读了这个 post 并尝试使用 "Extract Folder".
两者都会导致 ClassNotFoundException。
在您的情况下,您必须在服务器上安装 McJukebox 插件,运行 您自己的自定义插件。我想否则,您的插件将无法工作。一般来说,导出包含插件所需 类 的 source/jar 文件就足够了。您也可以 load jars through a function.
MANIFEST 中的 jars 引用指向本地目录 (.minecraft/plugins/
) 而不是源代码。
解决这个问题: 我的外部 jar 在 .minecraft/plugins/lib
而不是 .minecraft/plugins/myplugin/lib
.
另一种解决方案是将 MANIFEST.mf
中的这些罐子指向
ClassPath: myplugin/lib