使用 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 文件可能已损坏。如果你想正确地做到这一点,你有几个选择:
- 可行的简单选项:
创建一个有效的 bat 文件并执行该文件 - 您甚至可以先将文件复制到本地以确保它首先可用(如果它很大并且网络出现故障)
- 更好的解决方案:
使用java将文件复制到工作目录并从那里执行。
通过下载这样做的一个好处是您可以维护文件的一个版本(散列?),因此如果它相同则您不会下载它。或者您可以进行回退 - 如果网络驱动器不可用,则执行上次下载的版本。
- 为该 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
发表的想法
所以我有这段代码可以正常工作,它从我在我的电脑中配置为红色 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 文件可能已损坏。如果你想正确地做到这一点,你有几个选择:
- 可行的简单选项:
创建一个有效的 bat 文件并执行该文件 - 您甚至可以先将文件复制到本地以确保它首先可用(如果它很大并且网络出现故障)
- 更好的解决方案:
使用java将文件复制到工作目录并从那里执行。
通过下载这样做的一个好处是您可以维护文件的一个版本(散列?),因此如果它相同则您不会下载它。或者您可以进行回退 - 如果网络驱动器不可用,则执行上次下载的版本。
- 为该 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
发表的想法