代码之家  ›  专栏  ›  技术社区  ›  user3205479

CodeCompiler-从另一个Java程序编译并运行Java程序

  •  4
  • user3205479  · 技术社区  · 6 年前

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

    这里的挑战是我们正在加速一个过程 javac - compile code java - execute code

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

    我们能想到的解决办法

    1. javac 每一次,重用它,但如何(一旦编译完成javac就会自杀)?
    2. 爪哇语 应该编译字符串输入,而不是从文件。

    我们只是好奇在线编码竞赛平台是如何解决这些问题的?我们只针对Java。非常感谢您的帮助。

    https://www.journaldev.com/937/compile-run-java-program-another-java-program

    2 回复  |  直到 6 年前
        1
  •  3
  •   Luke Woodward    6 年前

    自Java1.6以来,Java已经有了一个编程API来访问Java编译器,而无需使用子进程。作为起点,请参见 documentation for the JavaCompiler class

        2
  •  0
  •   user699848    6 年前

    你可以用javax.tools.java编译器类来动态编译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();