【问题标题】:Java exec method not executing programJava exec方法不执行程序
【发布时间】:2016-08-22 17:15:11
【问题描述】:

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

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 程序。教程在这个网址:https://www.mkyong.com/java/how-to-execute-shell-command-from-java/

解决方案 我在 for 循环之外而不是在循环内部有 System.out.println(output.toString()) print 语句。现在,当我在循环内移动 SOP 语句时,它会打印一百万多行关于 ClearCase 版本控制内容的信息。要修复,请将带有 output.toString() 的 SOP 放入上述损坏代码的循环中。

【问题讨论】:

  • 您运行的是哪个版本的 ClearCase?在客户端的哪个操作系统上?在服务器端?您是否在动态视图中运行您的 Java 程序?
  • p 为空。我想你想将 Runtime.getRuntime().exec(command) 的返回类型分配给 p.
  • @omkarsirra 感谢您指出这一点。我忘记在代码中重新添加该分配,但刚刚做了。无论哪种方式都没有返回任何内容......我删除了对“p”的分配,因为它没有做任何事情,而是继续并将其添加回来,以便somone可以帮助调试它。我从这里得到这个成语:mkyong.com/java/how-to-execute-shell-command-from-java
  • @VonC 我不确定 ClearCase 的版本。我在客户端运行 Windows,但我不知道操作系统 ClearCase 正在为服务器运行。
  • @user3870315 cleartool -vercleartool -verall 应该告诉你版本。但是您是否处于动态视图中?

标签: java clearcase


【解决方案1】:

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

As I explained beforecleartool setview 命令打开一个子shell,命令应该在其中运行,这里不是这种情况(java程序在主shell中运行)

另一个可能的原因是你读取的是stdout,而不是stderr,不知何故这个命令返回了一个错误(可能它的执行路径不正确)。

我认为这并不重要,因为我在相关方法之前调用的方法应该将目录更改为动态视图。它似乎没有按预期工作,因为cleartool pwd 命令的结果只是我的桌面

是的,每个cleartool 命令都在自己的shell 中运行。您必须为每个 Java Process run("cleartool ...") 命令设置正确的执行文件夹,以便这些 cleartool 命令在正确的文件夹中启动。
请参阅“execute file from defined directory with Runtime.getRuntime().exec”,虽然答案有点过时,并且可能随着 Java8 发生变化。


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

【讨论】:

  • 我尝试像这样设置视图,//try to start a view into ClearCase Process r = Runtime.getRuntime().exec("cleartool startview dynamic_view_name"); 但程序只是在这里关闭并且'r'变量为空。
  • 我刚刚阅读了更多来自“正如我之前解释的”超链接的帖子。我可以尝试使用exec 选项,以便从那里调用另一个程序。 0_o
  • @user3870315 这不适用于您的情况,因为它适用于 Unix 而不是 Windows 上的动态视图。您需要确保您的cleartool pwdcleartool pwv:通过Java 尝试这些命令,看看是否有任何结果。
  • 啊,我很高兴它不适用,因为它在 Java 中变得非常复杂。 :) 我认为无论如何都没有关系,因为我在所讨论的方法之前调用的方法应该将目录更改为动态视图。它似乎没有按预期工作,因为cleartool pwd 命令的结果只是我的桌面。 :/ 感谢您的帮助。也许我们可以让它正确运行。
  • @user3870315 不要使用某些快捷方式。总是首先在完整的动态视图路径中测试:M:\myview\myvob\...
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多