我有这个程序,我正在编写有这个方法,应该执行一个程序,但没有做任何事情。有问题的方法如下:
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()在上面破坏的代码中的循环内。
答案 0 :(得分:2)
(java,python,bash,...)程序对ClearCase命令不执行任何操作的一种可能性是,如果所述cleartool
命令在已设置的动态视图中运行({{3} })。
cleartool setview
,cleartool 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文件中获取错误或详细信息,并确认执行命令时是否存在问题。