我正在为我的项目制作更新功能,它工作得很好,直到我希望它重新启动,基本上我下载新文件并用旧文件替换它,然后我想再次运行它,现在用于某些原因它没有运行,我没有得到任何错误...
这是完整的更新类: http://dl.dropbox.com/u/38414202/Update.txt
以下是我用来运行.jar文件的方法:
String currDir = new File("(CoN).jar").getAbsolutePath();
Process runManager = Runtime.getRuntime().exec("java -jar " + currDir);
答案 0 :(得分:1)
我不清楚为什么你需要通过调用exec()
来运行jar。鉴于您需要从Java程序运行.jar文件中的代码,您只需运行jar清单中定义的main()
方法,并捕获其输出 - 无论在何处。
当您需要从底层操作系统调用程序时,使用exec()
是正常的,但如果调用者和被调用者都是Java程序,则有更简单的方法可以执行此操作。
现在,如果您的jar会动态更改并且您需要根据新jar更新您的程序,则有重新加载其内容的机制,例如,看看另一个post。
答案 1 :(得分:0)
Process
类的JavaDocs特别指出,如果您没有捕获进程的输出流并立即读取它,则该进程可能会停止。如果是这种情况,那么您将看不到您开始运行的流程。
答案 2 :(得分:0)
我认为你必须像这样捕获stream
:
BufferedReader stdInput = new BufferedReader(new InputStreamReader(runManager.getInputStream()),8*1024);
BufferedReader stdError = new BufferedReader(new InputStreamReader(runManager.getErrorStream()));
// read the output from the command
String s = null;
System.out.println("Here is the standard output of the command:\n");
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
答案 3 :(得分:0)
exec
函数不会自动查找PATH以启动进程,因此您必须传递java
二进制文件的完整路径。
您可以使用java.home
系统属性执行此操作,请参阅以下答案:ProcessBuilder - Start another process / JVM - HowTo?
答案 4 :(得分:0)
这里似乎没有人帮助我,所以我去问我的朋友,我几乎是对的。它非常需要字符串作为数组。
溶液:
String[] cmd = {"java", "-jar", currDir};
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e1) {
e1.printStackTrace();
}