在Java程序中编译并运行Scala文件

在Java程序中编译并运行Scala文件,java,scala,Java,Scala,我正在开发一个Java程序,它在文本文件中接受Scala程序,编译它(在Java内部),然后运行它(也在Java内部)。我想不出一个干净的方法来实现这一点。为了编译,我尝试使用如下所示的代码: import scala.collection.JavaConversions; import scala.tools.nsc.Global; import scala.tools.nsc.Settings; Global g = new Global(new Settings()); Global.R

我正在开发一个Java程序,它在文本文件中接受Scala程序,编译它(在Java内部),然后运行它(也在Java内部)。我想不出一个干净的方法来实现这一点。为了编译,我尝试使用如下所示的代码:

import scala.collection.JavaConversions;
import scala.tools.nsc.Global;
import scala.tools.nsc.Settings;

Global g = new Global(new Settings());
Global.Run run = g.new Run();
List<String> fileNames = new ArrayList<String>(Arrays.asList("Hello.scala"));

run.compile(JavaConversions.asScalaBuffer(fileNames).toList());
我不明白是什么导致了这一问题,也不知道如何解决。作为临时解决办法,我尝试从外部编译Scala代码,并通过以下方式在Java中调用:

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("java -cp scala-library.jar;. Hello");
虽然我认为代码可以运行,但它并不像我希望的那样与Java程序交互。例如,在运行Scala程序(Java内部)时,如果Scala程序希望用户在控制台中键入字符串,Java程序基本上也应该这样做


欢迎提供任何指导。

最简单的方法可能只是使用一个小型包装器库,它可以处理类路径等问题。例如,有一个小型库()

以下是一个例子:

package-foo;
导入com.twitter.util.Eval;
公开课考试{
公共静态void main(字符串[]args){
最终评估=新评估();
最终整数结果=评估应用(“3+4”,真);
System.out.println(“结果:+Result”);
}
}


如果您想烘焙自己的编译器和运行程序包装器,这需要更多,您需要编译成虚拟文件,然后将它们加载到类加载器中(参见示例和)。

当我将Scala代码作为字符串直接放入应用程序时,我不会从对象打印“main”方法的结果。我可以通过“eval.compile(scalaCode.toString());”来编译它。然而,从那里我无法运行它。如果你想让我发布我的Scala代码作为问题的一部分,我可以这样做。你为什么不附加调用呢?像
“object Foo extensed App{println(“hello”)}
->
“object Foo{…};Foo.main(新数组[String](0))
的方法就是我从Java程序中调用对象内部函数的方法。
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("java -cp scala-library.jar;. Hello");