【问题标题】:Reference to a jar lib results in ClassNotFoundException with IntelliJ使用 IntelliJ 引用 jar 库会导致 ClassNotFoundException
【发布时间】:2019-12-12 22:38:20
【问题描述】:

我正在为我的世界编译一个插件,它基本上在登录时播放一首歌曲。 源码可以在here找到。

一个插件已经存在并提供了一个媒体播放器的教程,我遵循MC_Jukebox,源代码是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,与现有的插件/代码相比是正确的。 Lib 包含我的库 jar。 plugin.yml 是正确的,并且在没有对 lib 类的引用的情况下工作。 MANIFEST.MF

Manifest-Version: 1.0
Main-Class: EntryPoint
Class-Path: lib/

问题
即使在 MANIFEST 运行服务器和客户端的类路径中引用 lib 也会导致

[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 并尝试使用“提取文件夹”。
两者都会导致 ClassNotFoundException。

【问题讨论】:

    标签: java intellij-idea jar manifest minecraft


    【解决方案1】:

    在您的情况下,您必须在服务器上安装 McJukebox 插件,运行您自己的自定义插件。我想否则,您的插件将无法正常工作。一般来说,导出包含插件中需要的类的源/jar 文件就足够了。你也可以load jars through a function

    【讨论】:

    • 通过测试多种可能性找到了解决方案并理解,忘记关闭帖子:/我不想安装插件,只是为了访问使用它作为API的嵌入类。
    【解决方案2】:

    MANIFEST 中的 jar 引用指向本地目录 (.minecraft/plugins/) 而不是源代码一。

    要解决这个问题:我的外部 jar 位于 .minecraft/plugins/lib 而不是 .minecraft/plugins/myplugin/lib
    另一种解决方案是将这些罐子指向MANIFEST.mf

    类路径:myplugin/lib

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 2019-08-22
      • 2023-04-02
      • 2013-07-21
      • 1970-01-01
      相关资源
      最近更新 更多