【问题标题】:How do I use an API for my Bukkit plugins?如何为我的 Bukkit 插件使用 API?
【发布时间】:2021-01-11 04:07:40
【问题描述】:

正如标题所说,我尝试为使用 API 的 Minecraft 1.16.1 Spigot 服务器制作 Bukkit 插件。我的计划是制作一个插件(在 Eclipse 中),它分析服务器的一些统计信息,例如玩家人数和 TPS 等,并通过电子邮件将其发送到我的电子邮件地址。 为了实现这一点,我需要实现 Java-EE,因为 Java SE 没有发送电子邮件的能力。此外,我需要实现 java-mail-api。当我将其作为普通 jar 文件运行时,总共有 4 个 .jar 文件可以正常工作,其中 4 个 .jar 在构建路径中设置为“使用外部 jar”。 当我使用 maven 将 API 实现为 pom.xml 的依赖项时,它也可以正常工作。没问题。 但是当我将工作代码实现到 bukkit 插件中时,事情就开始出错了。

一开始我设置了一个简单的 onEnable 方法,看起来像这样

package mailsend;

import org.bukkit.plugin.java.JavaPlugin;

public class Mailer extends JavaPlugin {
    
    Commands cmds;
    
    @Override
    public void onEnable() {

        cmds = new Commands(); // this is line 12
        
        this.getCommand(cmds.cmd).setExecutor(cmds);
        
        System.out.println("Enabled Plugin MAIL");
        
    
    }
    
}

它启用插件和看起来像这样的命令执行器

package mailsend;

import java.io.UnsupportedEncodingException;

import javax.mail.MessagingException;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class Commands implements CommandExecutor {

    String cmd = "send";
    
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

        Player p = null;
        
        if(sender instanceof Player)
            p = (Player) sender;
        
        if(command.getName().equals(cmd)) {

            MailSender sndr = new MailSender();

            sndr.login(Data.smtp, Data.number, Data.email, Data.password);

            sndr.sendTestMail();
            
            return true;
        }
        
        return false;
    }
    
}

当我重新加载服务器时出现问题。例外是

[19:42:15 INFO]: [Mailer] Enabling Mailer v1.0
[19:42:15 ERROR]: Error occurred while enabling Mailer v1.0 (Is it up to date?)
java.lang.NoClassDefFoundError: javax/mail/MessagingException
    at mailsend.Mailer.onEnable(Mailer.java:12) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:351) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:480) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
    at org.bukkit.craftbukkit.v1_16_R1.CraftServer.enablePlugin(CraftServer.java:491) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
    at org.bukkit.craftbukkit.v1_16_R1.CraftServer.enablePlugins(CraftServer.java:405) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
    at net.minecraft.server.v1_16_R1.MinecraftServer.loadWorld(MinecraftServer.java:438) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
    at net.minecraft.server.v1_16_R1.DedicatedServer.init(DedicatedServer.java:219) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
    at net.minecraft.server.v1_16_R1.MinecraftServer.v(MinecraftServer.java:810) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
    at net.minecraft.server.v1_16_R1.MinecraftServer.lambda$0(MinecraftServer.java:164) ~[Spigot.jar:git-Spigot-ad703da-e2403a3]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_271]
Caused by: java.lang.ClassNotFoundException: javax.mail.MessagingException
    at java.net.URLClassLoader.findClass(Unknown Source) ~[?:1.8.0_271]
    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_271]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_271]
    ... 11 more

我所知道的关于这个异常的所有信息是,我正在使用的 API 中的类在这种情况下无法加载 javax/mail/MessagingException。这意味着我的插件不使用我在构建路径中设置的 API 对吗?我尝试使用实现的 API 导出插件,但这不起作用。我还尝试将 maven 用于这个 Bukkit 插件,但它也不起作用。我总是遇到这个异常,我真的不知道如何解决这个问题。但正如我所说,我猜我的插件没有以正确的方式导出,其中包含 API 或指向 API 的链接(我还创建了一个名为“lib”的文件夹,我将 API 放入其中,但不起作用..)。我还尝试将类路径添加到插件中生成的 MANIFEST 文件中,但这也不起作用..

我个人第一次使用 API 制作插件,我真的不知道如何以正确的方式做到这一点。如果有人能给我简单的说明如何解决这个问题,那就太好了!

【问题讨论】:

  • 如果您有外部 Jar 文件,您需要将这些文件与插件 jar 一起放入您的插件文件夹中。如果您使用例如 maven,则需要创建一个“胖”jar 文件 (stackoverflow.com/questions/63972961/…)
  • 它们都不起作用。我将 API 放入我的插件文件夹中,但它仍然给了我同样的错误(加载 API 时出现 +4 错误,因为它们不是插件)。制作一个'fat'-jar 文件也不起作用,或者我做错了什么。你能告诉我如何制作一个胖 jar 文件吗?
  • 我实际上还没有使用“fat”-jar 文件。所以我不能帮你抱歉:(
  • 我也有同样的问题。你解决了吗?
  • 很遗憾没有...我尝试使用 Eclipse 和 IntelliJ 但它们都不起作用...

标签: java api email minecraft bukkit


【解决方案1】:

您的服务器是否在 OpenJDK 上运行?据我所知,OpenJDK 不包含 javax. 类。

【讨论】:

  • 我其实不知道,我从 spigot 下载了服务器。我该如何检查?
  • 这与 Minecraft 服务器无关。您需要检查运行它的服务器/计算机的 Java 版本。通过在控制台中运行“java -version”来做到这一点。
  • java 版本 "1.8.0_291" Java(TM) SE Runtime Environment (build 1.8.0_291-b10) Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, 混合模式)
  • 但实际上,我有所有这些必要的 API 来实现这一点......但它不会......
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多