Ну, у меня в настоящее время есть это, оно прекрасно работает и полностью независим от ОС. Единственное, что должно работать: выполнение процесса Java без пути / etc, но я думаю, что это также можно исправить.
Все маленькие кусочки кода взяты из стека overflow, кроме RunnableWithObject и restartMinecraft ():)
Вам нужно назвать это так:
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;
}
Аааа и наконец класс RunnableWithObject:
package generic.minecraft.infinityclient;
public abstract class RunnableWithObject<T> implements Runnable {
public T data;
}
Удачи:)