在运行时运行Java文件

时间:2012-07-04 13:09:44

标签: java class runtime

我想在运行时运行我的应用程序用户提供的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。 Hier是控制台中的输出:

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

我在Windows 7上使用eclipse。

我想显示“My Method Called”来测试这个解决方案但是没有显示。

有任何帮助吗?谢谢!

2 个答案:

答案 0 :(得分: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();
    } 
}

答案 1 :(得分:0)

你可以考虑另一种方法。 Java有一个用于嵌入JavaScript,Python等的脚本API。现在,BeanShell是java。

比使用exec两次更快,更脆弱。