1

我将尝试在这个问题中尽可能描述,因为它很难解释..

开始。我有两个 jar 文件。一个(我自己的)和一个(The Bukkit jar)。bukkit jar,我喜欢在“./Server/bukkit.jar”中访问我正在运行的 bukkit jar 实例中的方法“org.bukkit.Bukkit.getServer()”,该实例由我自己的 processbuilder 启动罐..

所以在这里..

我自己的罐子代码:

public class Fukkit {
  public static void main(String[] args){
    ProcessBuilder pb = new ProcessBuilder("java", "-cp", "bukkit.jar", "org.bukkit.craftbukkit.Main");
    pb.directory(new File(new File(".").getPath() + File.separator + "Server"));
    try {
        pb.start();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    //I now want to access that instance of bukkit.jar, and use the method
    org.bukkit.Bukkit.getServer();
    //From inside the jar..

    //I cannot add it as a library, because the jar may be swapped out 
    //for another more updated version of bukkit.jar.. 
    //But that method will always be present. Can someone help me out..?
  }
}
4

1 回答 1

1

这种方法行不通。您正在尝试引用在单独的系统进程中加载​​的 Java 类- 它是否是您当前进程的子进程并不重要。从 Java 的角度来看,它是一个独立的 Java 虚拟机,两者之间没有特定于 Java 的通信。

你需要做的是:

  1. 将 bukkit.jar 添加到您的类路径(此处为示例)。
  2. 您的主要方法中Fukkit.main(),执行org.bukkit.craftbukkit.Main.main(new String [] {"your arguments here"}).
  3. 然后你应该能够参考org.bukkit.Bukkit.getServer() 和其他方法。

完成这个快速回答后,我现在才注意到您关于 JAR 可能正在更新的评论。好吧,有一些在运行时重新加载 JAR 的高级方法,但我建议在发生此类更新时简单地重新启动程序

另外,Bukkit 没有插件架构吗(我假设我们正在谈论 Minecraft Bukkit 服务器)?也许您正试图以迂回的方式进行,这导致了问题?尝试检查 Bukkit 的 API 是否不支持做你想做的事。

于 2012-12-26T19:23:52.613 回答