如何在另一个Java程序中运行可执行Jar文件

6

我知道这个问题之前已经被问过了,但那些答案并没有给我一个答案。

我想在我的Java程序中执行一个可执行的jar文件,并将执行jar的输出获取到一个字符串中。以下是我迄今为止使用但没有成功的代码。

cmdlink = "java -jar iwtest-mac.jar"+" "+cmd;
            System.out.println(cmdlink);
             Process process = Runtime.getRuntime().exec(cmdlink);
             BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
             while ((reader.readLine()) != null) {
                 st = reader.readLine();  

             }
             process.waitFor();

我尝试过另一段代码如下:

String cmdlink = "iwtest-mac.jar "+cmd;    
          ProcessBuilder pb = new ProcessBuilder("java", "-jar", cmdlink); //cmd here is a string that contains inline arguments for jar.
            pb.redirectErrorStream(true);
            pb.directory(new File("C:\\Users\\Dharma"));

            System.out.println("Directory: " + pb.directory().getAbsolutePath());
            Process p = pb.start();
            InputStream is = p.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            for (String line = br.readLine(); line != null; line = br.readLine()) {
                    System.out.println( line ); 
            p.waitFor();

上述两种方法对我都不起作用。欢迎提供任何建议。

1个回答

14

这对我有效。

public class JarRunner {
    public static void main(String[] args) {
        ProcessBuilder pb = new ProcessBuilder("java", "-jar", "C:\\JCcc.jar");
        pb.directory(new File("C:\\"));
        try {
            Process p = pb.start();
            LogStreamReader lsr = new LogStreamReader(p.getInputStream());
            Thread thread = new Thread(lsr, "LogStreamReader");
            thread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class LogStreamReader implements Runnable {

    private BufferedReader reader;

    public LogStreamReader(InputStream is) {
        this.reader = new BufferedReader(new InputStreamReader(is));
    }

    public void run() {
        try {
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这是文档中的一句话:

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");

你可以在构造函数中传递任意数量的参数。

了解更多关于进程构建器的信息,请点击此处


请问如果我需要为我的JAR文件提供命令行参数,我应该在上面的代码中指定它们吗? - Vardhan D G
错误:无法创建Java虚拟机。 错误:发生了致命异常。程序将退出。 未识别的选项:-jar 我得到了以上错误。 - Vardhan D G

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