我制作了一个 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)
}
}
您的代码存在多个问题,这些问题不符合 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”。另外,为了轻松找到包是什么或不是包,我们将所有包都写成小写,以大写开头类(你做到了),不要使用 _
作为类名等。
这是骆驼箱。
这是一个建议。其他读者(甚至几个月/几年后的您)更容易理解代码,但这不是必需的。