Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中运行.jar文件_Java_Jar - Fatal编程技术网

如何在java中运行.jar文件

如何在java中运行.jar文件,java,jar,Java,Jar,我正在为我的项目做一个更新功能,它工作得很好,直到我想要它重新启动,基本上我下载了新文件并用旧文件替换它,然后我想再次运行它,现在由于某种原因它没有运行,我没有得到任何错误 以下是完整的更新类: 下面是我用来运行.jar文件的方法: String currDir = new File("(CoN).jar").getAbsolutePath(); Process runManager = Runtime.getRuntime().exec("java -jar " + currDir);

我正在为我的项目做一个更新功能,它工作得很好,直到我想要它重新启动,基本上我下载了新文件并用旧文件替换它,然后我想再次运行它,现在由于某种原因它没有运行,我没有得到任何错误

以下是完整的更新类:

下面是我用来运行.jar文件的方法:

 String currDir = new File("(CoN).jar").getAbsolutePath();
 Process runManager = Runtime.getRuntime().exec("java -jar " + currDir);

进程的类
特别指出,如果不捕获进程的输出流并立即读取,进程可能会停止。如果是这种情况,那么您将看不到开始运行的流程。

我认为您必须捕获
流,如下所示:

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);
    }

我不清楚,为什么需要通过调用
exec()
来运行jar。考虑到您需要从Java程序运行.jar文件中的代码,您可以简单地运行jar清单中定义的
main()
方法,并捕获其输出(无论在何处)

当您需要从底层操作系统调用程序时,可以使用
exec()
,但是如果调用方和被调用方都是Java程序,则有更简单的方法来实现这一点


现在,如果您的jar将要动态更改,并且您需要根据新的jar更新您的程序,那么有一些机制可以重新加载其内容,例如查看另一个jar。

exec
函数不会自动查找启动进程的路径,因此,您必须传递
java
二进制文件的完整路径


您可以通过使用
java.home
系统属性来实现这一点,请参见以下答案:

这里似乎没有人帮助我,所以我去问我的朋友,我几乎做到了。它可能要求字符串是数组

解决方案:

String[] cmd = {"java", "-jar", currDir};
try {
  Runtime.getRuntime().exec(cmd);
} catch (IOException e1) {
  e1.printStackTrace();
}

在运行这个jar之后或运行期间,您希望得到什么?您是否希望能够退出当前的Java进程并将其替换为您刚刚启动的Java进程?考虑到Sun在Process类上提到的I/O限制,我不确定这是否可行。不过,我见过许多Java应用程序“自动更新”,所以一定有一些推荐的设计。我不确定你们是否理解我的意思,我说一切都很好,直到我再次运行它。。。那么为什么我需要输入流呢?我所要做的就是在替换.jar之后运行它,