我正在编写一个程序,需要能够通过命令提示符打开和终止Minecraft服务器。到目前为止,我的代码是:
Runtime.getRuntime().exec("cd ./Server"); //go to the server directory
Process server = Runtime.getRuntime().exec("java -Xmx1024M -Xms1024M -jar minecraft_server.exe nogui"); //run minecraft server in nogui mode
Thread.sleep((long)(1000*60*.5)); //wait 30 seconds
Runtime.getRuntime().exec("stop"); //terminate the server
Thread.sleep((long)(1000*60*.5)); //wait 30 seconds
server.destroy(); //forcibly terminate the server assuming it hasn't already
System.exit(0);
这只是我为它提出的基本逻辑代码。我尝试过使用BufferedWriters,但它们只是不起作用,即使执行cd命令也会出错。我正在使用Minecraft_Server.exe,它位于minecraft.net/download.jsp。 “stop”命令在进程处于活动状态时运行,并告诉程序保存服务器然后终止。我是否需要以某种方式使用Threads。请帮助:)我已经花了几个小时试图找到答案,我只是无能为力。
答案 0 :(得分:3)
你的“cd ./Server”命令,我认为这里会丢失上下文,因为下次调用exec不会得到第一次调用的结果。换句话说,对exec的每次调用都完全独立于对exec的其他调用。
尝试将其中的一部分放在shell脚本中,并简单地执行脚本。如果您仍然通过命令行控制服务器,那么这并不比您已经尝试过的更复杂。
答案 1 :(得分:1)
您可能需要查看ProcessBuilder(here),您可以在其中指定将用于您要执行的所有命令的工作目录。
答案 2 :(得分:1)
每个命令都作为单独的进程运行。
您的“cd ./Server”对您运行的命令没有影响。
你有一个名为stop的命令行程序吗?
我会写
Thread.sleep(30 * 1000); // 30 Seconds.
我不会调用System.exit(0);
答案 3 :(得分:1)
要运行命令,特别是dir使用特殊版本的exec
public Process exec(String command, String[] envp, File dir)
其中dir
正在为进程工作目录
答案 4 :(得分:0)
尝试将命令放在字符串数组中:
String[] cmd = { "cd","./Server" };
和
String[] cmd2 = {"java", "-Xmx1024M", "-Xms1024M", "-jar", "minecraft_server.exe", "nogui"}
然后尝试
Runtime.getRuntime().exec(cmd); //go to the server directory
Process server = Runtime.getRuntime().exec(cmd2); //run minecraft server in nogui mode
Thread.sleep((long)(1000*60*.5)); //wait 30 seconds
Runtime.getRuntime().exec("stop"); //terminate the server
Thread.sleep((long)(1000*60*.5)); //wait 30 seconds
server.destroy(); //forcibly terminate the server assuming it hasn't already
System.exit(0);
由于你没有提到要停止的内容,所以停止也不会做任何事情。