【问题标题】:Execute .jar file from a Java program从 Java 程序执行 .jar 文件
【发布时间】:2011-06-23 14:29:24
【问题描述】:

如何从 java 程序运行本地 jar 文件?

jar 文件不在 Java 调用程序的类路径中。

【问题讨论】:

    标签: java jar executable-jar


    【解决方案1】:

    我建议你使用ProcessBuilder 并启动一个新的JVM。

    以下是帮助您入门的内容:

    ProcessBuilder pb = new ProcessBuilder("/path/to/java", "-jar", "your.jar");
    pb.directory(new File("preferred/working/directory"));
    Process p = pb.start();
    

    【讨论】:

    • @aioobe 我可以将 System.out 集成到原始程序中吗?请原谅这个问题,但我是 java 新手
    • 不确定我是否理解您的评论,但您会从start() 收到Process,它会为您提供getInputStream / getOutputStream
    • 再次抱歉......如果我想像我一样将参数传递给 jar?
    • 您只需向ProcessBulider 构造函数添加更多参数:new ProcessBuilder("/path/to/java", "-jar", "your.jar", "arg1", "arg2");
    【解决方案2】:
        Process proc = Runtime.getRuntime().exec("java -jar Validate.jar");
        proc.waitFor();
        // Then retreive the process output
        InputStream in = proc.getInputStream();
        InputStream err = proc.getErrorStream();
    
        byte b[]=new byte[in.available()];
        in.read(b,0,b.length);
        System.out.println(new String(b));
    
        byte c[]=new byte[err.available()];
        err.read(c,0,c.length);
        System.out.println(new String(c));
    

    【讨论】:

    • 请使用 System.err.println(new String(c));用于打印错误消息。
    【解决方案3】:

    在windows上做的另一种方法是:

    Runtime.getRuntime().exec("cmd /c start jarFile");
    

    这样您也可以设置进程的优先级(正常/低/等)

    【讨论】:

      【解决方案4】:

      首先,您的问题的描述有点不清楚。我不明白您是想从 jar 文件中加载类以在您的应用程序中使用,还是 jar 包含您要运行的主文件。我会假设它是第二个。

      如果是这样,您有很多选择。 最简单的方法如下:

      String filePath; //where your jar is located.
      Runtime.exec(" java -jar " + filepath);
      

      瞧... 如果您不需要运行 jar 文件而是从中加载类,请告诉我。

      【讨论】:

      • 请把自己(踢和尖叫 - 如果需要)拖入 Java 1.5 和 ProcessBuilder 的能力中。
      • 这个解决方案会和ProcessBuilder那个一样(除非你想关闭等),而且你需要少输入。在我的事业中,我需要一个在打开罐子后自行关闭的启动器,所以这对我来说已经足够了。
      • 请记住,ProcessBuilder 是现在推荐的调用二进制文件的方法,并且在 java 9 中有新的增强功能:javaworld.com/article/3176874/java-language/…。已经有一篇文章讨论了 Runtime 和 ProcessBuilder 的区别:stackoverflow.com/questions/6856028/…
      • 如果您需要指定工作目录,此方法将不起作用。 ProcessBuilder 帮助了我(如上面的答案中所建议的那样)。
      【解决方案5】:

      【讨论】:

        【解决方案6】:

        您可以只使用这一行代码从任何您想要的地方运行一个 jar 文件。

            Desktop.getDesktop().open(new File("D:/FormsDesktop.jar"));
        

        在哪里

        new File("your path to jar")
        

        希望对你有帮助。

        谢谢。

        【讨论】:

          【解决方案7】:
          1. 将 jar 库添加到您的项目中
          2. 导入主类(见 jar 文件中的清单)
          3. 使用参数调用静态方法 main

            String args[] = {"-emaple","value"};
            PortMapperStarter.main(args);
            

          【讨论】:

            【解决方案8】:

            要从您的 java 应用程序中运行可执行 jar,您可以从 https://docs.oracle.com/javase/tutorial/deployment/jar/examples/JarClassLoader.java 复制 JarClassLoader

            像这样使用它。在这个 sn-p 中,jarUrl 是下载 jar 的 URL,例如 file:/tmp/my-jar.jar,args 是您要作为命令行参数传递给 jar 的字符串数组。

            JarClassLoader loader = new JarClassLoader(jarUrl);
            String main = loader.getMainClassName();
            loader.invokeClass(main, args);
            

            请记住,您现在正在将其他人的二进制文件插入到您的代码中。如果它陷入无限循环,你的线程就会挂起,如果它调用 System.exit(),你的 JVM 就会退出。

            【讨论】:

              【解决方案9】:

              1) 从环境变量中设置类路径

              2) 转到您的 jar 文件所在的文件夹

              3) 通过命令提示符运行以下命令

              java -jar jarfilename

              【讨论】:

              • 问题是如何从程序运行 jar 文件,而不是如何从命令行运行。
              猜你喜欢
              • 2012-11-30
              • 2023-03-16
              • 1970-01-01
              • 1970-01-01
              • 2012-02-28
              • 2013-08-01
              • 2013-06-30
              • 2013-02-17
              相关资源
              最近更新 更多