如何使用java中的processbuilder将参数传递给jar文件

时间:2015-04-03 11:13:43

标签: java runtime executable-jar processbuilder

java -jar twitie_tag.jar <path to model file> <path to input file> <output file>

我在java进程构建器中给出了上面的命令,如下所示

ProcessBuilder pb = new ProcessBuilder("java","-jar","twitie_tag.jar","models\\gate-EN-twitter.model", "newfile.txt"); 
pb.redirectErrorStream(true);
final Process process = pb.start();

InputStream stderr = process.getInputStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
          System.out.println(line);
}

process.waitFor();
System.out.println("Waiting ...");
System.out.println("Returned Value :" + process.exitValue());

但它在线程&#34; main&#34;中抛出错误为异常

  

java.lang.reflect.InvocationTargetException at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

如果我给redirectoutputstream它没有任何东西它只是打印等待而退出值是1

我有一个jar文件twittejar,我在命令行中执行java, -jar,twitie_tag.jar,gate-EN-twitter.model,newfile.txt,&gt; outfile.txt(输出将保存在outfile.txt中)。如果我给 java,-jar,twitie_tag.jar,gate-EN-twitter.model,newfile.txt(输出将显示在该命令窗口本身)但是我需要执行这些命令java程序。

4 个答案:

答案 0 :(得分:0)

在Linux或MacOSX上

private void runProcess(String jarFolder, String command) {
        Process pr = null;
        try {
            pr = Runtime.getRuntime().exec(new String[] {
                    "/bin/sh", 
                    "-c", 
                    "cd " + jarFolder + " ; " + command
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

(在Windows上,您使用相同的方法,但使用&#34; cmd.exe&#34;使用适当的参数。)

用以下方式调用:

runProcess(jarFolder, 
           "java -cp youJarFile packages.MainClass " + 
           param1 + " " + param2);

答案 1 :(得分:0)

然后问题是您没有运行Java命令的进程的输出或错误流。 您可能需要使用redirectOutput和redirectError方法重定向进程的输出,以便您可以查看运行jar文件的shell是否存在问题。

答案 2 :(得分:0)

你甚至&#34; .start()&#34;这个过程? ProcessBuilder仅累积您要在其下启动进程的条件,您需要在构建器对象上调用.start()以实际运行该进程并返回一个Process对象,您可以在该对象上执行.waitFor()。

请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html,因为说明中有一个很好的例子。

答案 3 :(得分:0)

文件文件=新文件(“errorlog.txt”);

        ProcessBuilder pb = new ProcessBuilder("java","-jar","twitie_tag.jar","models//gate-EN-twitter.model", "newfile.txt");
        pb.redirectOutput(file);
        final Process process = pb.start();

        InputStream stderr = process.getInputStream();
        InputStreamReader isr = new InputStreamReader(stderr);
        BufferedReader br = new BufferedReader(isr);
        String line = null;

       while ((line = br.readLine()) != null) {
         System.out.println(line);
       }
      process.waitFor();
      System.out.println("Waiting ...");
      System.out.println("Returned Value :" + process.exitValue());

感谢所有......他回答了我的问题