在 maven 中使用 Visual Studio 代码编码的 Minecraft 插件中出现 ClassNotFoundException

问题描述 投票:0回答:1

我制作了一个 jar 文件,其中包含一些可用于创建 minecraft 插件的代码,并希望为另一个文件创建一个本地存储库,该文件名为 lavidefaultlib-1.3.jar。 lavidefaultlib 堆栈在不同的路径上,两个 java 程序都在 D:/ 上。 每次我尝试启动 Minecraft 服务器时,上面有插件的服务器都会说找不到该类。服务器的错误消息如下所示:

java.lang.NoClassDefFoundError: com/lavi/GameMode/SPLi_GameMode
    at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[?:?]
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027) ~[?:?]
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) ~[?:?]
    at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:206) ~[spigot-api-1.21.1-R0.1-SNAPSHOT.jar:?]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593) ~[?:?]
    at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:117) ~[spigot-api-1.21.1-R0.1-SNAPSHOT.jar:?]
    at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:112) ~[spigot-api-1.21.1-R0.1-SNAPSHOT.jar:?]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?]
    at com.Lavi.Init.FileInit.onEnable(FileInit.java:30) ~[?:?]
    at com.Lavi.SPLi_Main_Main.onEnable(SPLi_Main_Main.java:31) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:267) ~[spigot-api-1.21.1-R0.1-SNAPSHOT.jar:?]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:342) ~[spigot-api-1.21.1-R0.1-SNAPSHOT.jar:?]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:492) ~[spigot-api-1.21.1-R0.1-SNAPSHOT.jar:?]
    at org.bukkit.craftbukkit.v1_21_R1.CraftServer.enablePlugin(CraftServer.java:575) ~[spigot-1.21.1-R0.1-SNAPSHOT.jar:4306-Spigot-a759b62-bd8aded]
    at org.bukkit.craftbukkit.v1_21_R1.CraftServer.enablePlugins(CraftServer.java:489) ~[spigot-1.21.1-R0.1-SNAPSHOT.jar:4306-Spigot-a759b62-bd8aded]
    at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:641) ~[spigot-1.21.1-R0.1-SNAPSHOT.jar:4306-Spigot-a759b62-bd8aded]
    at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:426) ~[spigot-1.21.1-R0.1-SNAPSHOT.jar:4306-Spigot-a759b62-bd8aded]
    at net.minecraft.server.dedicated.DedicatedServer.e(DedicatedServer.java:269) ~[spigot-1.21.1-R0.1-SNAPSHOT.jar:4306-Spigot-a759b62-bd8aded]
    at net.minecraft.server.MinecraftServer.y(MinecraftServer.java:1017) ~[spigot-1.21.1-R0.1-SNAPSHOT.jar:4306-Spigot-a759b62-bd8aded]
    at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:318) ~[spigot-1.21.1-R0.1-SNAPSHOT.jar:4306-Spigot-a759b62-bd8aded]
    at java.base/java.lang.Thread.run(Thread.java:1583) [?:?]
Caused by: java.lang.ClassNotFoundException: com.lavi.GameMode.SPLi_GameMode at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:160) ~[spigot-api-1.21.1-R0.1-SNAPSHOT.jar:?] at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:112) ~[spigot-api-1.21.1-R0.1-SNAPSHOT.jar:?] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?] ... 21 more

com.lavi.GameMode.SPLi_GameMode 类应该是我的 lavidefaultlib 中的类。 com.Lavi.SPLi_Main_Main 文件是我的 Minecraft 插件的主文件。 两个java项目都有一个POM文件并且是可编译的。

在 MainMinecraft 插件(不是 lavidefaultlib)中,我使用了默认的 spigot 存储库和我自己的应该引用该文件的存储库:

<repository>
    <id>lavilib</id>
    <url>file://D:/Minecraft/MinecraftPlugins/LaviDefault/lavidefaultlib/target/</url>
</repository>

我还放了一个

<dependency\>

<groupId>..</groupId>
<artifactId>Lavidefaultlib</artifactId>
<version>1.3</version>
<scope>provided</scope>

我不知道依赖关系和存储库是否有意义。我在互联网上查找了很多东西,但大多数都描述了不同的解决方案,但没有一个能够解决我的问题。另外,我发现的答案是八个不适用于minecraft插件或不适用于maven,看起来它在这里工作不同。

minecraft 主插件的代码看起来如何(简化,只包含问题的重要部分):

package com.Lavi.Init;

import com.lavi.SPLi_Main_Main;

public class FileInit { //This Class is my init class, it should initialiye the lavidefaultlib using a static method

    public static void onEnable(JavaPlugin ThePlugin) {      //This method gets called by my minecraft plugin while initializing
       
        SPLi_Main_Main.onEnable(ThePlugin);    //This is the call of the init method of lavidefaultlib onEnable (This produces the exyeption, that the class SPLi_Main_Main is not found)
    }
}
java maven pom.xml spigot
1个回答
0
投票

您的代码存在多个问题,这些问题不符合 spigot 的文档。

插口
onEnable()
方法不是那样的

在您的

plugin.yml
文件(文档)中,您应该将方向放在您的主类中。这个主类应该
extends JavaPlugin
。这不是静态调用,而是实例调用。如果您不知道什么是静态,请查看此处

所以,你的课堂会更像这样:

package com.Lavi.init;

import com.lavi.SPLi_Main_Main;

public class FileInit extends JavaPlugin {

    @Override
    public void onEnable() {
        SPLi_Main_Main.onEnable(this); // this = the actual object
    }
}

this
参数指的是实际的“FileInit”实例

在龙头上运行

在您的 Maven 项目中,您正在导入一个文件。该文件用于编译,但不包含在构建文件中。您必须将导入的文件放在您的服务器上(主要是如果另一个文件是另一个插件),或者您必须使用 maven 阴影插件 来对其进行着色。

公约

一般来说,套餐是

com/fr/de/io/etc
.
pseudo/enterprise/etc
.
projectname
。我认为你的项目不叫“Init”。另外,为了轻松找到包是什么或不是包,我们将所有包都写成小写,以大写开头类(你做到了),不要使用
_
作为类名等。

这是骆驼箱

这是一个建议。其他读者(甚至几个月/几年后的您)更容易理解代码,但这不是必需的。

© www.soinside.com 2019 - 2024. All rights reserved.