2012-07-04 114 views
0

我想在運行時運行我的應用程序用戶提供的java文件。在運行時運行Java文件

我想:

Process p1 = Runtime.getRuntime().exec("javac MyClass.java"); 
p1.waitFor(); 
Process p2 = Runtime.getRuntime().exec("java MyClass"); 
p2.waitFor(); 

但它不工作。它創建一個類文件,但它不創建一個二進制文件。

有什麼建議嗎?

我會精確我在做什麼:

因此,這裏是我的Java文件:

public class MyClass { 
    public void myMethod(){ 
     System.out.println("My Method Called"); 
    } 
} 

,這裏是我的代碼試圖編譯和執行這個類:

public class TestExecute { 

    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 MyClass.java"); 
      runProcess("java MyClass"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     } 

} 

在路徑中,創建MyClass.class。海爾是在控制檯輸出:

javac C:/Users/Maher/workspace/1/src/main/java/model/MyClass.java exitValue() 0 

我使用的Windows 7

Eclipse和我想顯示「我被調用的方法」來測試該解決方案,但它並沒有顯示出來。

任何幫助?謝謝!

+3

該類文件是一個二進制文件。 – maba

+0

類文件確實是一個二進制文件。這在我的電腦上正常工作。 – damned

+1

還要注意有一個API來訪問Java編譯器:http://docs.oracle.com/javase/7/docs/api/javax/tools/JavaCompiler.html – Puce

回答

1

如果您期望輸出的編譯或運行的Java類,那麼你必須閱讀子進程的InputStream

Process p2 = Runtime.getRuntime().exec("java MyClass"); 
BufferedReader br=new BufferedReader(new InputStreamReader(p2.getInputStream())); 

String line=null; 
while((line=br.readLine())!=null) 
    { 
    System.out.println(line); 
    } 
p2.waitFor(); 

編輯:添加main()方法。

public class MyClass { 
    public void myMethod(){ 
     System.out.println("My Method Called"); 
    } 
    public static void main(String[] args){ 
     new MyClass().myMethod(); 
    } 
} 
+0

我試過了,但它不工作:( –

+0

@Mahermassaabi - 您需要在MyClass中添加入口點--main()'方法來啓動* MyClass *。 – adatapost

+0

我認爲您也應該處理stderr: 'InputStream stderr = process.getErrorStream();' 我也建議main方法看起來像這樣: public class MyClass public static void main(String [] args){System.out.println(「My Method Called」 ); } } ' – gkuzmin

0

你可以考慮另一種方法。 Java有一個用於嵌入JavaScript,Python等的腳本API。現在,BeanShell是java。

它比使用exec兩次更快,更脆弱。