从Java应用程序编译并运行源代码

从Java应用程序编译并运行源代码,java,compiler-construction,Java,Compiler Construction,我需要从我的Java应用程序中编译并运行用Python、Pascal或C编写的源代码(单个文件) 我需要知道: 如果编译过程成功 编译程序的返回输出 如何实现这一点?您可以使用java.lang.ProcessBuilder执行命令并检查状态。 这里是JAVADOC:您可能需要使用Runtime.exec()调用相应的编译器。查看以获取有关如何处理输出等的更多信息。通常,您需要启动一个运行外部程序(首先是编译器,然后是编译后的二进制文件)的进程,使用Runtime.getRuntime().

我需要从我的Java应用程序中编译并运行用Python、Pascal或C编写的源代码(单个文件)

我需要知道:

  • 如果编译过程成功
  • 编译程序的返回输出

如何实现这一点?

您可以使用java.lang.ProcessBuilder执行命令并检查状态。
这里是JAVADOC:

您可能需要使用
Runtime.exec()
调用相应的编译器。查看以获取有关如何处理输出等的更多信息。

通常,您需要启动一个运行外部程序(首先是编译器,然后是编译后的二进制文件)的
进程,使用
Runtime.getRuntime().exec()
ProcessBuilder
来生成
进程
(由于编译器可能需要一组复杂的选项,
ProcessBuilder
可能是一个更好的选项)。这将允许您在进程执行时获取它的输出(这样您就可以监视编译器输出中的警告或错误),以及它的返回代码

您可能会发现以下示例很有帮助:


要获取正在运行的
进程的返回代码
,只需使用
waitFor()
方法。如果您不关心任何输出,只需要返回值,那么这很方便。

如果您主要做代码片段,您可以尝试使用Jython运行Python代码。有关详细信息,请参阅。

我一直在做同样的事情

public String compile()
       {
           String log="";
            try {
                String s= null;
              //change this string to your compilers location
            Process p = Runtime.getRuntime().exec("cmd /C  \"C:\\Program Files\\CodeBlocks\\MinGW\\bin\\mingw32-g++.exe\" temp.cpp ");

            BufferedReader stdError = new BufferedReader(new 
                 InputStreamReader(p.getErrorStream()));
            boolean error=false;

            log+="\n....\n";
            while ((s = stdError.readLine()) != null) {
                log+=s;
                error=true;
                log+="\n";
            }
            if(error==false) log+="Compilation successful !!!";

        } catch (IOException e) {
            e.printStackTrace();
        }
            return log;
       }


     public int runProgram() 
       {
           int ret = -1;
          try
            {            
                Runtime rt = Runtime.getRuntime();
                Process proc = rt.exec("cmd.exe /c start a.exe");
                proc.waitFor();
                ret = proc.exitValue();
            } catch (Throwable t)
              {
                t.printStackTrace();
                return ret;
              }
          return ret;                      
       }  
这是我的第一个用于编译的函数中使用的两个函数。将地址更改为编译器位置。并返回日志(如果编译失败)以查看错误

第二个运行编译后的代码。返回退出代码以检查其是否正确终止


我不是一个很好的java程序员。我想你可以更好地改进我的代码;)。。如果你这样做,请通知我。我还想在

有用的链接上找到答案,并提供一些很好的例子。