【问题标题】:Executing jar file using Java only works on a pc to pc basis使用 Java 执行 jar 文件只能在 pc 到 pc 的基础上工作
【发布时间】:2019-01-16 15:46:34
【问题描述】:

我正在尝试为 Java 应用程序创建一个启动器,它将自动更新/下载计算机用户主区域中的 jar 文件,然后继续执行它。

我尝试使用 Process 和 Runtime 类来运行 jar 文件,我在自己的电脑上只取得了成功,但似乎 1:10 的人尝试了这个分布式软件(也在 jar 中form) 似乎无法运行 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% 的成功。

【问题讨论】:

  • 您是否在转义 saveDirectory 变量中的空格?
  • saveDirectory 变量如下:private static String saveDirectory = System.getProperty("user.home")+"/"; 附加参考文件名变量如下:private static String fileName = "Client.jar";

标签: java windows jar process


【解决方案1】:

如果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 });

【讨论】:

  • 感谢您的回答。您能否澄清一下包含空格的 user.home 是什么意思,以便我更好地理解这个问题?是否也建议使用这样的 ProcessBuilder:ProcessBuilder pb = new ProcessBuilder("java", "-jar", saveDirectory + fileName); Process p = pb.start();
  • java -jar C:\User\myself\My Documents\Downloads\app.jar 将失败,因为 C:\User\myself\My 不是 JAR 位置,Documents\Downloads\app.jar 不是 main() 参数。空格是java -jar 语法的分隔符。
  • 感谢您的澄清和提供的帮助。
【解决方案2】:

您的原始代码在以下前提下运行,即“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! :)

为了使您的程序更加可移植,您应该将所有/s 和\s(平台相关的路径分隔符)替换为:

System.getProperty("file.separator");

[3]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 2016-07-17
    • 1970-01-01
    • 2020-03-15
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多