从Java程序中执行.jar文件

44

如何从Java程序中运行本地Jar文件?

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

10个回答

52

我建议您使用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 的新手。 - vfgjrk
1
我不确定我理解你的评论,但是你可以从start()获得一个Process,它提供了getInputStream/getOutputStream - aioobe
抱歉再次打扰..如果我想向jar文件传递参数,我该怎么做? - vfgjrk
1
你只需要向ProcessBuilder构造函数添加更多的参数:new ProcessBuilder("/path/to/java", "-jar", "your.jar", "arg1", "arg2"); - aioobe

15
    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));

2
请使用 System.err.println(new String(c)); 来打印错误消息。 - Nitin Mahesh

3

首先,你提出的问题描述不太清楚。我不知道你是想要加载 jar 文件中的类来在应用程序中使用,还是该 jar 包含一个你想要运行的主文件。我假设它是后者。

如果是这样,你有很多选择。

其中最简单的一个如下:

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

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


2
请尽力掌握Java 1.5和ProcessBuilder(即使需要时要像被踢和抗议一样)。 - Andrew Thompson
这个解决方案与ProcessBuilder相同(除非您想要关闭等),并且您需要输入更少的内容。在我的情况下,我需要一个启动器,在打开一个jar文件后自动关闭,所以这对我来说已经足够了。 - user5066707
请记住,ProcessBuilder是现在推荐调用二进制文件的方式,并且在Java 9中有新的增强功能:http://www.javaworld.com/article/3176874/java-language/java-9s-other-new-enhancements-part-3.html。已经有一篇文章讨论了Runtime和ProcessBuilder之间的区别:https://dev59.com/_Gw15IYBdhLWcg3wD3dk。 - Nikola Yovchev
如果您需要指定工作目录,则这种方法行不通。ProcessBuilder在我需要时帮助了我(如上面的答案建议的那样)。 - Andrey Kotov


2
另一种在Windows上的方法是:
Runtime.getRuntime().exec("cmd /c start jarFile");

这样你就可以设置进程的优先级(普通/低等)


永远不要在调用外部程序时使用“cmd”!这种方法存在安全漏洞!请勿使用!(参数可能会被系统工具监测) - marcolopes

1
  1. Add jar library to your project
  2. Import main class (see manifest in jar file)
  3. Invoke static method main with arguments

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

这个主意很棒!我想知道它是否适用于可运行的JAR文件 :D - marcolopes

1

这是我的方法,我认为更加完整:

public static Process exec(String path, String filename) throws IOException {
    String javaHome = System.getProperty("java.home");
    String javaBin = javaHome +
            File.separator + "bin" +
            File.separator + "java";

    ProcessBuilder pb = new ProcessBuilder(javaBin, "-jar", path+filename);
    return pb.start();
}

1

您可以使用以下一行代码从任何位置运行jar文件。

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

where

new File("your path to jar")

希望它有所帮助。

谢谢。


此方法在调用外部程序时存在安全漏洞!请勿使用!(参数可以通过系统工具进行监视) - marcolopes

1

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

使用方法如下。在此片段中,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将退出。

-4

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

2)进入您的jar文件所在的文件夹

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

java -jar jar文件名


1
问题是如何从程序中运行jar文件,而不是如何从命令行中运行。 - Henrik Aasted Sørensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接