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

Open external .jar with Runtime.getRuntime().exec with java

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

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

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

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

但是没有用(我可以毫无问题地手动访问和打开文件)。

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

问题是,如果问题是space,我该如何解决呢?我找不到办法。另一方面,我如何在另一台机器上 运行 它?我必须以某种方式使用那个红色的 ubication IP 吗?

PD:使用此代码,return 我是对的

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

所以看起来 spaces 没有干扰路径(四个“\”在启动时似乎在测试中没有做任何事情)

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

无论如何运行来自网络的代码可能不是最佳解决方案。首先,网络可能不可用,或者即将到来的 java 文件可能已损坏。如果你想正确地做到这一点,你有几个选择:

  1. 可行的简单选项:

创建一个有效的 bat 文件并执行该文件 - 您甚至可以先将文件复制到本地以确保它首先可用(如果它很大并且网络出现故障)

  1. 更好的解决方案:

使用java将文件复制到工作目录并从那里执行。

通过下载这样做的一个好处是您可以维护文件的一个版本(散列?),因此如果它相同则您不会下载它。或者您可以进行回退 - 如果网络驱动器不可用,则执行上次下载的版本。

  1. 为该 jar 使用本地 Maven 存储库和依赖项:)

这样它会在本地保留jar 的版本,而不必每次都下载它。如果可用,它还会下载新版本,代码会更主流(例如不依赖平台/pc)

@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

发表的想法