CodeCompiler-如何从另一个Java程序编译和运行Java程序?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (248)

我们正在尝试为我们的一个客户构建一个java代码编译器来创建在线编码测试。我们通过REST API将源代码发布到端点。接下来,我们将针对测试文件编译并执行输出,然后将结果返回给客户端。

这里的挑战是我们正在启动一个流程,javac - compile code并且java - execute code每个流程实际需要30MB RAM和600 ms。

这是非常巨大的我们无法处理八核和16GB RAM上的1000个用户的负载。如果我们一次得到200个请求,则会产生200个进程,这个进程很重,其他请求排队等待。

我们可以想到的解决方案

  1. 不要javac每次都启动,重用它但是如何(javac在编译完成后自杀)?
  2. javac 应该编译字符串输入而不是文件。

我们只是好奇在线编码竞争平台如何解决这些问题?

提问于
用户回答回答于

从Java 1.6开始,Java就有了一个编程API来访问Java编译器,而无需使用子进程

用户回答回答于

可以使用javax.tools.JavaCompiler类动态编译java文件,下面是让开始的代码片段

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
List<String> optionList = new ArrayList<String>();
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, optionList, null,
    fileManager.getJavaFileObjectsFromFiles(Arrays.asList(javaFiletoCompile)));
if (task.call())
{
    //success
} else
{
    //fail      
}
fileManager.close();

扫码关注云+社区

领取腾讯云代金券