2016-08-22 4 views
2

이 프로그램은 프로그램을 실행하기로되어 있지만 아무 것도하지 않는 프로그램입니다. 명령이 아무것도하지 않는 이유Java exec 메서드가 프로그램을 실행하지 않습니다.

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를 돌려 다음과 같이 문제의 방법은?

기본적으로 ping 프로그램 대신 cleartool 프로그램을 사용하고 있습니다. 튜토리얼은이 URL에 있습니다 : https://www.mkyong.com/java/how-to-execute-shell-command-from-java/

솔루션 내가 루프 대신 그 안에 외부의 System.out.println(output.toString()) 인쇄 문을했다. 이제 루프 내부에서 SOP 문을 움직이면 ClearCase 버전 컨트롤에 대한 정보가 백만 개 더 늘어납니다. 수정하려면 위의 깨진 코드의 루프 안에 output.toString()을 사용하여 SOP를 수정하십시오.

+0

실행중인 ClearCase의 버전은 무엇입니까? 클라이언트 측의 OS는 무엇입니까? 서버 측에서? 동적 뷰에서 Java 프로그램을 실행하고 있습니까? – VonC

+0

p는 null입니다. 나는 당신이 반환 유형을 Runtime.getRuntime(). exec (command) p에 할당하려고한다고 생각한다. –

+0

@omkarsirra 감사합니다.나는 그 과제를 코드에 다시 추가하는 것을 잊어 버렸지 만 지금은 그랬다. 어느 쪽이든 반환되는 것은 아무것도 없습니다 ... 왜냐하면 어떤 일도하지 않았기 때문에 'p'에 대한 과제를 제거했기 때문이죠. 그래서 somone이 디버깅에 도움이 될 수 있도록 다시 추가했기 때문입니다. 여기에서이 관용구를 얻었습니다 : https://www.mkyong.com/java/how-to-execute-shell-command-from-java/ – user3870315

답변

2

(cleartool setview) 설정된 동적보기 내에서 상기 cleartool 명령을 실행하면 (java, python, bash, ...) ClearCase 명령으로 아무 것도 수행 할 수없는 가능성이 있습니다.

As I explained beforecleartool setview 명령은

다른 원인은 당신이 읽고있는 것입니다 (자바 프로그램이 주요 쉘에서 실행) 여기이 아니다 명령을 실행하기로되어있는 서브 쉘을 엽니 다 stdout이 아니라 stderr이고 어떤 식 으로든이 명령은 오류를 반환합니다 (아마도 실행 경로가 올바르지 않을 수 있습니다).

thought it would not matter anyway because a method I call before the one in question is supposed to change directories to the dynamic view. It appears it does not work as expected though because the result of the cleartool pwd command is just my desktop

예, 각 cleartool 명령은 자체 셸에서 작동합니다. 각 Java Process run("cleartool ...") 명령에 대해 올바른 실행 폴더를 설정하여 cleartool 명령이 올바른 폴더에서 시작되도록해야합니다.
"execute file from defined directory with Runtime.getRuntime().exec"을 참조하십시오. 답변은 약간 날짜가 있고 Java8로 변경되었을 수 있습니다. 영업 이익이 언급 한 바와 같이


output.toString() 인쇄 문은 내부 루프 말했다 대신 for loop 외부이었다.
당신은 추가적인 예를 볼 수 있습니다

+0

나는'//은 ClearCase에 \t \t 프로세스 R = Runtime.getRuntime() 간부 ("cleartool의 startview의 dynamic_view_name")을보기를 시작하려고하므로, 같은보기를 설정 시도,'하지만이 프로그램은 여기 종료 'r'변수는 null입니다. – user3870315

+0

"이전에 설명했듯이"하이퍼 링크로 된 게시물을 더 읽었습니다. 'exec' 옵션을 사용하여 다른 프로그램이 호출되도록 시도 할 수 있습니다. 0_o – user3870315

+0

@ user3870315 Windows가 아닌 Unix에서의 동적보기이기 때문에 귀하의 경우에는 적용하지 말아야합니다. 'cleartool pwd'와'cleartool pwv'를 확인해야합니다 : Java를 통해 해당 명령을 시도하고 결과가 있는지 확인하십시오. – VonC

0

은 sh 명령을 사용하여 자식 쉘 내부 명령을 실행하고 nohup을 참조 nohup을 위해 출력을 리디렉션 sh 명령.

일단 명령을 실행하면 (예 : "nohup cleartool describe"+ sql_file; 오류 또는 세부 정보를 nohup.out 파일에서 가져 와서 명령을 실행할 때 문제가 있는지 확인할 수 있습니다.

관련 문제