2012-07-04 45 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两次更快,更脆弱。