从Java程序执行.jar文件

从Java程序执行.jar文件,java,jar,executable-jar,Java,Jar,Executable Jar,如何从java程序运行本地jar文件 jar文件不在Java调用者程序的类路径中。我建议您使用并启动一个新的JVM 以下是一些让您开始学习的内容: ProcessBuilder pb = new ProcessBuilder("/path/to/java", "-jar", "your.jar"); pb.directory(new File("preferred/working/directory")); Process p = pb.start(); 首先,对您的问题的描述有点不清楚。我不

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

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

我建议您使用并启动一个新的JVM

以下是一些让您开始学习的内容:

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

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

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

String filePath; //where your jar is located.
Runtime.exec(" java -jar " + filepath);
瞧。。。
如果您不需要运行jar文件,而是从中加载类,请告诉我。

以下内容有用吗


在windows上执行此操作的另一种方法是:

Runtime.getRuntime().exec("cmd /c start jarFile");
通过这种方式,您还可以设置进程的优先级(正常/低/etc)

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

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

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


java-jarjarfilename

只要使用这一行代码,就可以从任何地方运行jar文件

    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));
    Desktop.getDesktop().open(new File("D:/FormsDesktop.jar"));
在哪里

希望能有帮助

谢谢

  • 将jar库添加到项目中
  • 导入主类(参见jar文件中的清单)
  • 使用主参数调用静态方法

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

  • 要从java应用程序内部运行可执行jar,可以从

    像这样使用它。在这个代码段中,
    jarUrl
    是下载jar的URL,例如,args是要作为命令行参数传递给jar的字符串数组

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

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

    @aioobe我可以将System.out集成到原始程序中吗?请原谅这个问题,但我是Java新手,不确定我是否理解您的评论,但是您从
    start()
    返回了一个
    过程,它为您提供了
    getInputStream
    /
    getOutputStream
    。再次抱歉。。如果我想像我一样向jar传递一个参数,只需向
    ProcessBulider
    构造函数添加更多参数:
    newProcessBuilder(“/path/to/java”、“-jar”、“your.jar”、“arg1”、“arg2”)请将您自己(踢和尖叫-如果需要)拖入Java 1.5和ProcessBuilder的功能中。此解决方案将与
    ProcessBuilder
    解决方案相同(除非您想关闭等),并且您需要键入更少的内容。在我的原因中,我需要一个在打开jar后自动关闭的启动器,这对我来说已经足够了。请记住,ProcessBuilder是现在推荐的调用二进制文件的方法,java 9中有一些新的增强功能:。已经有一篇文章讨论了运行时和ProcessBuilder之间的区别:。如果需要指定工作目录,则此方法将不起作用。ProcessBuilder帮助了我(如上面的答案所示)。问题是如何从程序运行jar文件,而不是如何从命令行运行。请使用System.err.println(新字符串(c));用于打印错误消息。
    JarClassLoader loader = new JarClassLoader(jarUrl);
    String main = loader.getMainClassName();
    loader.invokeClass(main, args);