使用Bukkit / Classpaths

时间:2012-12-26 19:05:00

标签: java jar classpath external

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

到此为止。我有两个jar文件。一个(我自己的),一个(Bukkit jar)。 bukkit jar,我在“./Server/bukkit.jar”中徘徊。我想在我自己的一个流程构建器启动的bukkit jar的运行实例中访问方法“org.bukkit.Bukkit.getServer()”罐子..

所以,这里..

我自己的罐子代码:

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..?
  }
}

1 个答案:

答案 0 :(得分:1)

此方法无效。您正在尝试引用在单独的system process中加载的Java类 - 无论它是否是您当前进程的子级都无关紧要。从Java的角度来看,它是一个单独的Java虚拟机,两者之间没有特定于Java的通信。

您需要做的是:

  1. 将bukkit.jar添加到类路径(example here)。
  2. 您的主要方法Fukkit.main()中,执行org.bukkit.craftbukkit.Main.main(new String [] {"your arguments here"})
  3. 然后您应该可以参考org.bukkit.Bukkit.getServer() 和其他方法。
  4. 完成这个快速回答后,我现在才注意到你对JAR可能更新的评论。好吧,有一些在运行时重新加载JAR的高级方法,但我建议只要在发生这样的更新时重启你的程序。

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