我正在尝试为Java应用程序创建启动器,该启动器将自动更新/下载计算机用户主区域中的jar文件,然后继续执行它。
我试图同时使用Process和Runtime类来运行jar文件,除了在我自己的PC上取得成功外,我什么都没有,但是似乎有1:10的人尝试了这种分布式软件(也在jar中)表单)似乎无法运行jar文件(作为参考,我已确保所有测试此应用程序的人都安装了最新版本的Java)。
负责运行jar文件的代码如下:
public static void startApplication() {
try {
Process proc = Runtime.getRuntime().exec("java -jar "+(saveDirectory + fileName));
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
我希望jar文件fileName在位置saveDirectory中打开,但是在PC到PC的情况下,情况并非总是如此。我只是想知道是否有更好的方法可以确保100%的成功。
答案 0 :(得分:3)
如果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 });
答案 1 :(得分:1)
您的原始代码在以下前提下运行,即“ java”(通常)在“ PATH”上可用(或特别是在当前工作目录中可用)。
@Karol的观点可能也是一个问题!
(exec(String[])
比exec(String)
更好)
但是,调用Java /与(OS)'PATH'变量的存在和内容无关的一种更可靠的方法是在前面加上System.getProperty("java.home")/bin/
至java
。
(因为这是always set和has precedence over eventual OS variables)
现在,您只需要为PATH_EXT
变量祈祷。 :)(例如Windows中的“ .exe; .bat ...”)...但是有一个不错的希望:(在客户端计算机上)至少已安装并正在运行一个jvm! :)
为使程序更具可移植性,应 将所有/
和\
(与平台相关的路径分隔符)替换为:
System.getProperty("file.separator");