【问题标题】:Executing a Jar file from an Java application从 Java 应用程序执行 Jar 文件
【发布时间】:2012-11-30 14:00:21
【问题描述】:

我编写了 2 个方法来尝试从我的 Java 应用程序执行 Jar 文件,但它们都没有做任何事情。 Java Runtime Environment 安装在 C: 驱动器上,默认情况下其 Path 指向 C: 驱动器上的目录。我尝试执行的 Jar 文件位于 E: 驱动器上。

Jar 位置:E:\Demo Folder\MyDemo.jar

我尝试使用以下 2 种方法执行 MyDemo.jar:

方法一:

try {
    Runtime.getRuntime().exec("cmd /c start %SystemDrive%\\java -jar " + "E:/Demo Folder/MyDemo.jar");
} catch (IOException ex) {
    System.err.println(ex.getMessage());
}

方法二:

try {
    File dirFile = new File("E:/Demo Folder/");
    ProcessBuilder pb = new ProcessBuilder("java", "-jar", "E:/Demo Folder/MyDemo.jar");
    pb.directory(dirFile);
    Process p = pb.start();
} catch (Exception ex) {
    System.err.println(ex.getMessage());
}

【问题讨论】:

  • 我会这样做,但我不知道总是知道安装了哪个版本的 java 以及安装到什么位置。在他的例子中,他得到了 /path/to/java
  • 然后尝试从系统属性中读取Java的路径。应该是 Java.home
  • 只是一个猜测,但您是否需要为项目设置环境变量(假设您使用的是 Eclipse)。换句话说,如果你从命令行运行你的应用程序,我敢打赌第二个会起作用。
  • 我正在使用 NetBeans,我会尝试这两个建议。

标签: java cmd processbuilder


【解决方案1】:

您没有尝试将您的调用逻辑放在一个例如 E:/Demo Folder/rundemo.bat`(或 .cmd)文件中,然后从您的 java 中调用该 .bat 吗?这通常更理智,也更容易排除故障。

【讨论】:

    【解决方案2】:

    我猜问题是 jar 文件路径中的空间。试试这个:

    new ProcessBuilder("java", "-jar", "\"E:/Demo Folder/MyDemo.jar\"");
    

    【讨论】:

      【解决方案3】:

      要启动外部 java 可执行应用程序,您必须首先找到 java.exe 文件(加载 JVM)并传递 -jar 参数以指示加载可执行 JAR 文件。在您提供的两种方法中,您的代码中都有小错误。

      在方法一中:

      cmd /c start %SystemDrive%\\java -jar

      %SystemDrive% 被视为字符串文字,因为 java 不知道 Windows 特定的环境变量。

      在方法二中:

      “java”、“-jar”、“E:/Demo 文件夹/MyDemo.jar”

      您假设 java.exe 已添加到 PATH 环境变量中,但情况可能并非如此。此外,根据您对“%”运算符的使用,我假设您在 Windows 机器上,因此它使用 \ 作为目录...“E:/Demo Folder/MyDemo.jar”可能不会返回有效位置。

      试试下面这段代码:

      try {
          File dirFile = new File("E:\\Demo Folder\\");
          ProcessBuilder pb = new ProcessBuilder(System.getProperty("java.home") + File.separator + "bin" + File.separator + "java", "-jar", new File(dirFile, "MyDemo.jar").getAbsolutePath());
          pb.directory(dirFile);
          Process p = pb.start();
      } catch (Exception ex) {
          System.err.println(ex.getMessage());
      }
      

      【讨论】:

        猜你喜欢
        • 2011-06-23
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多