2011-01-30 18 views
26

Test.java kodunda Main.java'yı derlemek ve çalıştırmak istediğim Main.java ve Test.java sınıflarım var. İşte benim kodjava programını başka bir java programında derlemek ve çalıştırmak nasıl?

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

Sadece Main.java içinde "Tamam" yazdırmak ama bu kod şey yazmaz. Sorun nedir ? Bu süreci yürütme biraz zaman alacaktır ve süreç henüz bitmeden,() exitValue alamaz çünkü

+0

sen http://docs.codehaus.org/display aradığınız gibi görünüyor .. başarıyla sona ermiş mi derleme işlemi için kontrol etmek Laj sınıf ana işlevi koşul eklemiş/JANINO/Ev;). – phihag

+0

@phihag sadece java kodu örneğidir. C/C++ kodu ile genelleştireceğim ve ohters –

+0

'Process.getOutputStream' kullanmanız gerekmiyor mu? –

cevap

29

: Her şey güzel olduğunda

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

, sadece çalışan: Burada

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 olduğunu

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

Şimdi, örneğin, Main.java'da bir hatam varsa:

Daha önce derlenmiş olan Main.class hala orada olduğu için hala "ok" yazıyor, ancak en azından işlemleriniz çalışırken tam olarak ne olduğunu görebilirsiniz.

+0

+1. Bu iki dosyayı aynı pakete koydum. Benim hatamdı. Eğer main.java' dosyasında 'int i = System.in.read();' varsa, Sergey –

+0

teşekkürler? –

+0

@Addy, daha sonra, işlemin ihtiyaç duyduğu verileri işlemek için ikinci işlemde “getOutputStream()” kullanmanız gerekir. Ya da sadece bu akışı kapatın, böylece süreç hemen EOF alır. –

0

Ayrıca

pro2.waitFor(); 

gerekir.

Bazı kontrolleri içerecek şekilde kodunu değiştirmiş
+0

Bu, bu da hiçbir cevap vermedim –

+0

@ hilal, aslında son döngüden sonra yapmanız gerekir. Süreç çalışırken çıktıların çıktısını okursunuz, bu tamam, ancak bitirdikten sonra exitValue() öğesine erişebilirsiniz. –

+0

@Sergey Doğru kodu içeren cevabı gönderebilir misiniz? –

0

Ben

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

yardım edebilir misiniz, daha fazla netleştirmek için bakım? – rockinfresh