【问题标题】:how to compile & run java program in another java program?如何在另一个java程序中编译和运行java程序?
【发布时间】:2011-06-18 01:54:56
【问题描述】:

我有一个 Main.java 和 Test.java 类,我想在 Test.java 代码中编译和运行 Main.java。这是我的代码

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

我只是在 Main.java 中打印“ok”,但这段代码没有打印任何内容。有什么问题?

【问题讨论】:

  • 看起来你正在寻找docs.codehaus.org/display/JANINO/Home ;) .
  • @phihag 这只是 java 代码示例。我将用 c/c++ 代码和 ohters 来概括它
  • 你不应该使用Process.getOutputStream吗?
  • 进程的exitValue() 是什么?它们在 ErrorStreams 中输出什么?
  • 对我来说很好。您确定 java 和 javac 在 PATH 中吗?如果您从命令行运行这些命令,它会起作用吗?如果您想更好地控制编译过程,您可能还希望使用 javax.tools 包进行编译。

标签: java process runtime.exec


【解决方案1】:

我在 Laj 类主函数中添加了条件来检查编译过程是否成功完成..

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

【讨论】:

  • 答案,需要进一步澄清吗?
【解决方案2】:

我已经修改了代码以包含一些检查:

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:

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

当一切正常时,它就可以工作了:

alqualos@ubuntu:~/tmp$ java Laj
javac Main.java exitValue() 0
java Main stdout: ok
java Main exitValue() 0

现在,例如,如果我在 Main.java 中有一些错误:

alqualos@ubuntu:~/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

它仍然打印“ok”,因为之前编译的 Main.class 仍然存在,但至少您可以看到进程运行时到底发生了什么。

【讨论】:

  • +1。我将这两个文件放在同一个包中。这是我的错误。谢谢谢尔盖
  • @Addy,那么您需要在第二个进程上使用getOutputStream() 来为该进程提供所需的数据。或者只是关闭该流,以便进程立即获得 EOF。
  • 我们如何在其中传递参数?
  • 当我尝试像这样使用 && 运行这两个命令时...... javac Main.java && java Main -> 它失败了......你能帮忙@sergey
【解决方案3】:

你还需要

pro2.waitFor();

因为执行该过程需要一些时间,并且您不能在该过程完成之前使用 exitValue()。

【讨论】:

  • 我这样做了,但这也没有给出任何答案
  • @hilal,您实际上需要在最后一个循环之后执行此操作。你在进程运行的时候读取它的输出,没关系,但是只有在它完成后你才能访问exitValue()。
  • @hilal,您第一版的代码对我来说运行良好,没有任何更改。不过,我会发布带有检查的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
相关资源
最近更新 更多