使用Runtime.getRuntime()。exec打开外部.jar

时间:2018-01-23 09:15:32

标签: java jar exec

所以我有这个代码工作正常,它从我在我的电脑中配置的另一台机器启动.jar文件作为红色ubication

Runtime.getRuntime().exec("java -jar Z:\\AAA\\BBB\\CCC\\ZZZ.jar");

但是现在我想从外部路径启动.jar而不使用之前的快捷方式(因此我可以在没有配置红色的机器中使用此代码启动它)

Runtime.getRuntime().exec("java -jar MMM\\NNN LLL\\OOO\\AAA\\BBB\\CCC\\ZZZ.jar");

但是doent工作(我可以手动访问和打开文件而没有问题)。

当我在命令提示符下输入java -jar MMM\\NNN LLL\\OOO\\AAA\\BBB\\CCC\\ZZZ.jar时,它返回Error: Unable to access jarfile MMM\NNN,所以可能有一个问题是路径在文件夹名称中有空格,但我认为这也可能是其他内容

问题是,如果问题是空间,我该如何解决?我找不到办法。而另一方面,我如何在另一台机器上运行它?我必须以某种方式使用红色IP:

PD:使用此代码,它返回true

File f = new File("\\\\MMM\\NNN LLL\\OOO\\ZZZ.jar");
System.out.println(f.exists()); //--> true

所以看起来空间不会干扰路径(四个" \"在启动时似乎没有在测试中做任何事情)

2 个答案:

答案 0 :(得分:0)

我听过其他人有这样的问题。主要原因是Java exec方法可能不是网络(SMB)。所以它甚至不尝试从网络开放。

无论如何,从网络上运行代码可能不是最好的解决方案。首先,网络可能不可用,或者java文件可能已损坏。如果你想做得好,你有几个选择:

  1. 可以使用的简单选项:
  2. 创建一个可以运行并执行该文件的bat文件 - 您甚至可以先在本地复制该文件,以确保它首先可用(如果它很大且网络出现故障)

    1. 更好的解决方案:
    2. 使用java将文件复制到工作目录并从那里执行。

      通过下载这样做的一个好处就是你可以维护一个版本的文件(哈希?),所以如果它是相同的,你就不要下载它。或者您可以进行备用 - 如果网络驱动器不可用,则执行上次下载的版本。

      1. 使用该jar的本地maven存储库和依赖项:)
      2. 这样它将在本地保留jar的版本,并且不必每次都下载它。它还将下载新版本(如果可用)并且代码将更加主流(例如,不依赖于平台/ PC)

答案 1 :(得分:0)

@MadProgrammer给出的答案很好!

ProcessBuilder builder = new ProcessBuilder("java",  "-jar", "MMM\\NNN LLL\\OOO\\AAA\\BBB\\CCC\\ZZZ.jar");
try {
    builder.start();
} catch (IOException e) {
    e.printStackTrace();
}   

非常感谢!无论如何要查看Veselin Davidov发布的想法