我正在尝试为Java应用程序创建一个启动器,该应用程序将在计算机的用户主区域中自动更新/下载jar文件,然后继续执行它。
我尝试使用进程和运行时类运行 jar 文件,在我自己的 PC 上我只取得了成功,但似乎尝试这种分布式软件(也是 jar 形式的 1:10 人)似乎无法运行 jar 文件(作为参考,我已经确保所有测试此应用程序的人都安装了最新版本的 Java)。
负责运行 jar 文件的代码如下:
public static void startApplication() {
try {
Process proc = Runtime.getRuntime().exec("java -jar "+(saveDirectory + fileName));
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
我希望在位置 saveDirectory 中打开 jar 文件文件名,但在 pc 到 pc 的情况下,情况并非总是如此。我只是想知道是否有更好的方法来确保 100% 的成功。
如果user.home
包含空格,则可能无法正常工作,因为命令按原样计算,因为该命令是按原样提供的String
。使用Runtime.exec(String[])
版本:
Runtime.getRuntime().exec(new String[] { "java", "-jar", saveDirectory + fileName });
此外,您可能希望规范化 JAR 路径:
Path path = Paths.get(saveDirectory, fileName);
String fullPath = path.normalize().toAbsolutePath().toString();
Runtime.getRuntime().exec(new String[] { "java", "-jar", fullPath });
你的原始代码在这样一个前提下运行,即"java"(一般)在"PATH"上可用(或者特别是在当前工作目录中可用)。
@Karol的重点也可能是一个问题!(exec(String[])
比exec(String)
好
但是,独立于(OS)"PATH"变量的存在和内容调用java/be的更可靠的方法是,pre-pend:System.getProperty("java.home")/bin/
到java
。(因为这始终是设置的,并且优先于最终的操作系统变量)现在你只需要为PATH_EXT
变量祈祷。:)(例如".exe;.蝙蝠..."在窗口中)...但有一个体面的希望:(在客户端计算机上)至少安装并运行了一个 JVM!:)
为了使您的程序更具可移植性,您应该将所有/
s 和 s(平台相关路径分隔符)替换为:
System.getProperty("file.separator");
[3]