我给自己做了一个奇特的TikZ-Api,它允许可视化数据(绘图,图表)。它的工作方式是,创建一个像TikZAPI api = new TikZAPI();这样的应用编程接口实例,然后像api.addPoint(xCoord, yCoord)一样为绘图(带点的简单绘图)添加数据。在我收集了一些数据之后,我可以使用api.print();打印绘图的整个代码。然后,代码将出现在控制台中,我可以手动将其复制并粘贴到LaTeX文档中,在那里我可以查看绘图。现在实际的问题与API无关,API工作得很好。我想要收集我的minecraft服务器的一些数据,例如每小时的最大玩家数量,并将这些数据添加到绘图中,以便将其打印到控制台中。但是当我使用我的API作为一个库(IntelliJ: Project Structure -> Libraries -> + -> Library,它工作得很好,我可以在我的插件中访问我的API的所有方法)并重新加载服务器时,我得到了这个错误:
org.bukkit.command.CommandException: Unhandled exception executing command 'test' in plugin TestAPI v1.0.0
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[Spi
got.jar:git-Spigot-ad703da-e2403a3]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:14
9) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at org.bukkit.craftbukkit.v1_16_R1.CraftServer.dispatchCommand(CraftServ
er.java:755) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.PlayerConnection.handleCommand(PlayerCo
nnection.java:1703) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.PlayerConnection.a(PlayerConnection.jav
a:1546) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.PacketPlayInChat.a(PacketPlayInChat.jav
a:47) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.PacketPlayInChat.a(PacketPlayInChat.jav
a:1) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.PlayerConnectionUtils.lambda$0(PlayerCo
nnectionUtils.java:19) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.TickTask.run(SourceFile:18) ~[Spigot.ja
r:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.IAsyncTaskHandler.executeTask(SourceFil
e:144) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.IAsyncTaskHandlerReentrant.executeTask(
SourceFile:23) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.IAsyncTaskHandler.executeNext(SourceFil
e:118) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.MinecraftServer.aZ(MinecraftServer.java
:943) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.MinecraftServer.executeNext(MinecraftSe
rver.java:936) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.IAsyncTaskHandler.awaitTasks(SourceFile
:127) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.MinecraftServer.sleepForTick(MinecraftS
erver.java:920) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.MinecraftServer.v(MinecraftServer.java:
852) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at net.minecraft.server.v1_16_R1.MinecraftServer.lambda$0(MinecraftServe
r.java:164) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_291]
Caused by: java.lang.NoClassDefFoundError: tikzapi/TikZAPI
at test.Commands.onCommand(Commands.java:39) ~[?:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[Spi
got.jar:git-Spigot-ad703da-e2403a3]
... 18 more
Caused by: java.lang.ClassNotFoundException: tikzapi.TikZAPI
at java.net.URLClassLoader.findClass(Unknown Source) ~[?:1.8.0_291]
at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.
java:167) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.
java:96) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_291]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_291]
at test.Commands.onCommand(Commands.java:39) ~[?:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[Spi
got.jar:git-Spigot-ad703da-e2403a3]
... 18 more好吧,我认为错误是API没有被加载。但是我该怎么做呢?我已经把API放到我的服务器的plugins文件夹中了,不能工作。我在插件文件夹中创建了一个名为"lib“的子文件夹,也不起作用。不管我用的是Eclipse还是IntelliJ,这两种IDE都不能工作。我读到它与清单文件有关,但是我如何创建这样的清单文件,它真的解决了我的问题吗?我不能使用maven,因为它是我自己制作的API,我想像使用一个普通的库一样使用它。有什么想法吗?
发布于 2021-04-26 23:24:07
我假设你的TikZ-Api已经编译好了.jar文件。
我会试着给你的解决方案的IntelliJ想法,但一般的想法是相同的所有IDE。当您将.jar添加到库中,然后编译您的插件时,集成开发环境假定所有这些源代码都将由VM实例在运行期间提供,并且集成开发环境不必将库源代码与插件JAR文件打包在一起。这只适用于bukkit.jar,因为bukkit首先启动,然后加载插件。它不知道在某个地方还有另一个API JAR也应该被加载...
第一个简单的解决方案是将原始的(未编译的) .java源代码复制到你的集成开发环境中的插件中,并且根本不添加库。(仅当你的应用程序接口只有很少的.java文件,并且你仍然可以使用它们时才有用)
的第二个解决方案是将.jar接口添加到库中(正如你所提到的),并告诉在编译过程中应该将一些库打包到您的插件中,最终的.jar文件将包含它们。在IDEA中,您必须在编译到.jar之前创建工件配置。

然后选择extract。

然后从那里删除你的bukkit条目(因为我们不想把整个bukkit源代码打包到我们的插件中),你应该在那里看到你的API .jar文件。然后单击Apply / OK。

现在,当您使用Build artifacts构建(编译)插件时,您的.jar应用程序接口也将被编译并打包到您的插件JAR文件中,该文件将在out\artifacts中生成
发布于 2021-04-27 03:19:58
这里最好的方法是将API作为插件,并将依赖项加载到plugin.yml中。这样,很容易通过任何其他插件访问它,并且如果您在不同的插件中使用API,也不会出现更新兼容性问题。使用MC Server中的norme和API来创建一个作为API的插件。
https://stackoverflow.com/questions/67241405
复制相似问题