猿问

使用 IntelliJ 引用 jar 库导致 ClassNotFoundException

我正在为我的世界编译一个插件,它基本上在登录时播放一首歌曲。

我的代码使用这个外部 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/

问题即使在运行服务器和客户端的类路径中

引用也会导致libMANIFEST


[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

如何在文件夹下引用我的 jar 中包含的 jar lib?


我正在使用Intellij进行编码和编译。我读了这篇文章,也尝试使用“提取文件夹”。

两者都会导致 ClassNotFoundException。


RISEBY
浏览 129回答 2
2回答

蝴蝶不菲

MANIFEST 中的 jars 引用指向本地目录 ( .minecraft/plugins/) 而不是源代码目录。要解决这个问题:我的外部罐子在.minecraft/plugins/lib而不是.minecraft/plugins/myplugin/lib。另一种解决方案是将这些罐子MANIFEST.mf指向类路径:myplugin/lib

德玛西亚99

在您的情况下,您必须在服务器上安装 McJukebox 插件,运行您自己的自定义插件。我想否则,您的插件将无法工作。一般来说,导出包含插件所需类的源/jar 文件就足够了。您还可以通过函数加载 jar。
随时随地看视频慕课网APP

相关分类

Java
我要回答