嗯,我目前有这个,它运行良好,并且完全独立于操作系统。唯一必须工作的事情:执行没有任何路径/等的java进程,但我认为这也可以修复。
除了 RunnableWithObject 和 restartMinecraft() 之外的小代码都来自stackoverflow :)
你需要这样称呼它:
restartMinecraft(getCommandLineArgs());
所以它的基本作用是:
- 生成一个新进程并将其存储在 p 变量中
- 创建两个 RunnableWithObject 实例并将进程对象填充到它们的数据值中,然后启动两个线程,当它有可用数据时它们只打印 inputStream 和 errorStream 直到进程退出
- 等待进程退出
- 打印有关进程退出的调试消息
- 以进程的退出值终止(非必要)
是的,它是直接从我的 Minecraft 项目中提取的:)
代码:
Tools.isProcessExited() 方法:
public static boolean isProcessExited(Process p) {
try {
p.exitValue();
} catch (IllegalThreadStateException e) {
return false;
}
return true;
}
Tools.restartMinecraft() 方法:
public static void restartMinecraft(String args) throws IOException, InterruptedException {
//Here you can do shutdown code etc
Process p = Runtime.getRuntime().exec(args);
RunnableWithObject<Process> inputStreamPrinter = new RunnableWithObject<Process>() {
@Override
public void run() {
// TODO Auto-generated method stub
while (!Tools.isProcessExited(data)) {
try {
while (data.getInputStream().available() > 0) {
System.out.print((char) data.getInputStream().read());
}
} catch (IOException e) {
}
}
}
};
RunnableWithObject<Process> errorStreamPrinter = new RunnableWithObject<Process>() {
@Override
public void run() {
// TODO Auto-generated method stub
while (!Tools.isProcessExited(data)) {
try {
while (data.getErrorStream().available() > 0) {
System.err.print((char) data.getErrorStream().read());
}
} catch (IOException e) {
}
}
}
};
inputStreamPrinter.data = p;
errorStreamPrinter.data = p;
new Thread(inputStreamPrinter).start();
new Thread(errorStreamPrinter).start();
p.waitFor();
System.out.println("Minecraft exited. (" + p.exitValue() + ")");
System.exit(p.exitValue());
}
Tools.getCommandLineArgs() 方法:
public static String getCommandLineArgs() {
String cmdline = "";
List<String> l = ManagementFactory.getRuntimeMXBean().getInputArguments();
cmdline += "java ";
for (int i = 0; i < l.size(); i++) {
cmdline += l.get(i) + " ";
}
cmdline += "-cp " + System.getProperty("java.class.path") + " " + System.getProperty("sun.java.command");
return cmdline;
}
Aaaa 最后是 RunnableWithObject 类:
package generic.minecraft.infinityclient;
public abstract class RunnableWithObject<T> implements Runnable {
public T data;
}
祝你好运:)