2011-01-30 45 views
26

Tôi có một lớp Main.java và Test.java mà tôi muốn biên dịch và chạy Main.java trong mã Test.java. Đây là mã của tôilàm thế nào để biên dịch và chạy chương trình java trong một chương trình java khác?

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); 
    } 

Tôi chỉ in "ok" trong Main.java nhưng mã này không in được gì. Vấn đề là gì?

+0

Dường như bạn đang tìm kiếm http://docs.codehaus.org/display/JANINO/Trang chủ;). – phihag

+0

@phihag nó chỉ là ví dụ về mã java. Tôi sẽ khái quát nó với mã c/C++ và ohters –

+0

Bạn không phải sử dụng 'Process.getOutputStream'? –

Trả lời

29

tôi đã sửa đổi mã để bao gồm một số kiểm tra:

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(); 
    } 
    } 
} 

Đây là Main.java:

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

Khi mọi thứ đều tốt, nó chỉ hoạt động:

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

Ví dụ: nếu tôi gặp lỗi trong 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 

Nó vẫn in "ok" vì Main.class được biên dịch trước đó vẫn còn đó, nhưng ít nhất bạn có thể thấy chính xác những gì đang xảy ra khi các tiến trình của bạn đang chạy.

+0

+1. Tôi đặt hai tệp này trong cùng một gói. Đó là lỗi của tôi. Cảm ơn Sergey –

+0

nếu có 'int i = System.in.read();' trong tệp 'Main.java'? –

+0

@Thêm, sau đó bạn cần sử dụng 'getOutputStream()' trên quy trình thứ hai để nạp dữ liệu cho quá trình cần thiết. Hoặc chỉ cần đóng luồng đó để quy trình nhận được EOF ngay lập tức. –

0

Bạn cũng cần phải

pro2.waitFor(); 

vì thực hiện quá trình đó sẽ mất một thời gian và bạn không thể lấy exitValue() trước khi quá trình đã hoàn tất.

+0

Tôi đã làm điều này bu này cũng không cung cấp cho bất kỳ câu trả lời –

+0

@ hilal, bạn thực sự cần phải làm điều đó sau vòng lặp cuối cùng của bạn. Bạn đọc process'es đầu ra trong khi nó đang chạy, đó là okay, nhưng bạn có thể truy cập exitValue() chỉ sau khi nó đã kết thúc. –

+0

@Sergey bạn có thể đăng câu trả lời có chứa mã đúng không? –

0

Tôi đã thêm điều kiện trong hàm main lớp Laj để kiểm tra quá trình biên soạn đã hoàn thành hay không ..

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

câu trả lời, chăm sóc để làm rõ thêm? – rockinfresh

Các vấn đề liên quan