2011-01-30 2 views
26

Test.java 코드에서 Main.java를 컴파일하고 실행하려는 Main.java 및 Test.java 클래스가 있습니다. 여기 내 코드가다른 Java 프로그램에서 Java 프로그램을 컴파일하고 실행하는 방법은 무엇입니까?

Process pro1 = Runtime.getRuntime().exec("javac Main.java"); 
    pro1.waitFor(); 
    Process pro2 = Runtime.getRuntime().exec("java Main"); 

    BufferedReader in = new BufferedReader(new InputStreamReader(pro2.getInputStream())); 
    String line = null; 

    while ((line = in.readLine()) != null) { 
     System.out.println(line); 
    } 

그냥 "ok"를 Main.java에 인쇄하지만이 코드는 아무 것도 인쇄하지 않습니다. 문제가 무엇입니까? 해당 프로세스를 실행하는 시간이 좀 걸릴 것입니다 프로세스가 완료되기 전에()가 exitValue을 할 수 없기 때문에

+0

당신이 http://docs.codehaus.org/display 찾고있는 것 같은데 .. 성공적 여부를 완료 컴파일 프로세스를 확인하기 위해 라즈 클래스의 주요 기능에 조건을 추가 한/자니노/집;). – phihag

+0

@phihag 그냥 자바 코드 예입니다. 나는 c/C++ 코드와 오타로 일반화 할 것이다 –

+0

'Process.getOutputStream'을 사용하지 않겠습니까? –

답변

29

: 모든 것이 잘되면

public class Main { 
    public static void main(String[] args) { 
    System.out.println("ok"); 
    } 
} 

이, 그냥 작동 : 여기

public class Laj { 

    private static void printLines(String name, InputStream ins) throws Exception { 
    String line = null; 
    BufferedReader in = new BufferedReader(
     new InputStreamReader(ins)); 
    while ((line = in.readLine()) != null) { 
     System.out.println(name + " " + line); 
    } 
    } 

    private static void runProcess(String command) throws Exception { 
    Process pro = Runtime.getRuntime().exec(command); 
    printLines(command + " stdout:", pro.getInputStream()); 
    printLines(command + " stderr:", pro.getErrorStream()); 
    pro.waitFor(); 
    System.out.println(command + " exitValue() " + pro.exitValue()); 
    } 

    public static void main(String[] args) { 
    try { 
     runProcess("javac Main.java"); 
     runProcess("java Main"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

는 Main.java입니다

[email protected]:~/tmp$ java Laj 
javac Main.java exitValue() 0 
java Main stdout: ok 
java Main exitValue() 0 

예를 들어 Main.java에 오류가있는 경우 :

[email protected]:~/tmp$ java Laj 
javac Main.java stderr: Main.java:3: package Systems does not exist 
javac Main.java stderr:  Systems.out.println("ok"); 
javac Main.java stderr:   ^
javac Main.java stderr: 1 error 
javac Main.java exitValue() 1 
java Main stdout: ok 
java Main exitValue() 0 

이전에 컴파일 된 Main.class가 여전히 있기 때문에 "ok"가 계속 표시되지만 프로세스가 실행 중일 때 정확히 어떤 현상이 발생하는지 알 수 있습니다.

+0

+1. 이 두 파일을 같은 패키지에 넣었습니다. 그건 내 잘못이야. Thanks Sergey –

+0

'Main.java' 파일에'int i = System.in.read();'가 있다면? –

+0

@Addy, 그러면 두 번째 프로세스에서 필요한 데이터를 처리하기 위해'getOutputStream()'을 사용해야합니다. 또는 프로세스가 EOF를 즉시 얻을 수 있도록 스트림을 닫으십시오. –

0

는 또한

pro2.waitFor(); 

해야합니다.

나는 몇 가지 검사 포함하도록 코드를 수정 한
+0

나는이 일을했다. 이것 또한 아무 대답도하지 말아라. –

+0

@hilal, 당신은 실제로 당신의 마지막 루프 이후에 그것을 할 필요가있다. 실행 중에 process'es 출력을 읽는다면 괜찮습니다.하지만 작업이 끝난 후에 만 ​​exitValue()에 액세스 할 수 있습니다. –

+0

@Sergey는 올바른 코드가 포함 된 답변을 게시 할 수 있습니까? –

0

나는

public class Laj { 

    private static void printLines(String name, InputStream ins) throws Exception { 
    String line = null; 
    BufferedReader in = new BufferedReader(
     new InputStreamReader(ins)); 
    while ((line = in.readLine()) != null) { 
     System.out.println(name + " " + line); 
    } 
    } 

    private static int runProcess(String command) throws Exception { 
    Process pro = Runtime.getRuntime().exec(command); 
    printLines(command + " stdout:", pro.getInputStream()); 
    printLines(command + " stderr:", pro.getErrorStream()); 
    pro.waitFor(); 
    // System.out.println(command + " exitValue() " + pro.exitValue()); 
    return pro.exitValue(); 
    } 

    public static void main(String[] args) { 
    try { 
    int k = runProcess("javac Main.java"); 
    if (k==0) 
    k=runProcess("java Main"); 

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

답변을 더 명확하게하는 데 도움이 될 수 있습니까? – rockinfresh

관련 문제