我正在使用MEAN堆栈做在线编码测试应用程序。在nodejs中寻找解决方案,编译用户在编辑器中输入并提交的Java代码。用户可以输入测试输入,运行和检查输出。
我用exec方法遇到了下面的解决方案,
exec('java -jar userCode.jar',function (error, stdout, stderr){
});
但是这个解决方案听起来并不可行,因为它需要在编译之前从用户提交的java代码中创建jar文件。
这个问题有更好的解决方案吗?
假设用户将其源代码作为单个文件提交:
你能做的是使用javac将源代码编译成一个可执行类,然后简单地用java执行它。
编译:javac -cp /path/to/libs/jar/files MyProgram.java
执行:java -cp .;/path/to/libs/jar/files MyProgram
它会工作,但要注意安全隐患。您基本上允许用户在您自己的服务器上执行不受信任的代码。只要确保以非特权用户的身份执行代码,没有读写权限,也没有网络访问权限!还可以适当地限制cpu共享并超时执行。
我找到了nodeJS库compilex的解决方案,它允许编译多种语言,如Java, C, c++, c#, Python等。它还支持来自User的输入。