Java exec方法不执行程序

时间:2016-08-22 17:15:12

标签: java clearcase

我有这个程序,我正在编写有这个方法,应该执行一个程序,但没有做任何事情。有问题的方法如下:

public void findCC_Data(List<String> l7) {

         StringBuffer output = new StringBuffer();

         Process p;
         try {
            for(String sql_file: l7) {
                String command = "cleartool describe " + sql_file;
                p = Runtime.getRuntime().exec(command);
                System.out.println("Executing: " + command);
                p.waitFor();
                BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String line = "";
                while ((line = reader.readLine()) != null) {
                    output.append(line + "\n");
                }
                if (reader.readLine() == null) {
                    System.out.println("'reader.readLine()' is equal to null");
                }


            }

        } catch(Exception e) {
            e.printStackTrace();
        }

        System.out.println(output.toString());



     }

有没有人知道为什么命令没有做任何事情而且reader.readLine()方法总是返回null?

我正在学习一个教程,但基本上使用的是cleartool程序而不是ping程序。该教程位于以下URL:https://www.mkyong.com/java/how-to-execute-shell-command-from-java/

解决方案 我在for循环之外的System.out.println(output.toString())打印语句而不是在其中。现在,当我在循环中移动SOP语句时,它会在ClearCase版本控制内容上打印一百多行信息。要修复SOP和output.toString()在上面破坏的代码中的循环内。

2 个答案:

答案 0 :(得分:2)

(java,python,bash,...)程序对ClearCase命令不执行任何操作的一种可能性是,如果所述cleartool命令在已设置的动态视图中运行({{3} })。

cleartool setviewcleartool setview命令打开一个子shell,其中应该运行命令,这不是这里的情况(java程序在主shell中运行)

另一个可能的原因是你正在读stdout而不是stderr,并且这些命令会以某种方式返回错误(可能它的执行路径不正确)。

  

认为无论如何都没关系,因为我之前调用的方法应该将目录更改为动态视图。它似乎不能按预期工作,因为cleartool pwd命令的结果只是我的桌面

是的,每个cleartool命令都在自己的shell中运行。必须为每个Java Process run("cleartool ...")命令设置正确的执行文件夹,以便在正确的文件夹中启动这些cleartool命令。
请参阅“As I explained before”,虽然答案有点过时,但Java8可能会有所改变。

正如OP所指出的那样,output.toString()打印语句不在for loop之内,而是在所述循环内部。
您可以在以下位置查看其他示例:

答案 1 :(得分:0)

使用sh命令在子shell中运行命令,并将输出重定向到nohup,请参阅nohup和sh命令。

一旦你执行了命令,即&#34; nohup cleartool描述&#34; + sql_file; 您可以从nohup.out文件中获取错误或详细信息,并确认执行命令时是否存在问题。