我正在开发一个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());
然而,我收到错误(为清晰起见而减少):
error: error while loading Object, Missing dependency 'object scala in compiler mirror', required by C:\Program Files\Java\jdk1.7.0_79\jre\lib\rt.jar(java/lang/Object.class)
我不明白造成这种情况的原因或解决方法。作为临时解决方法,我尝试在外部编译Scala代码并通过以下方式在Java中调用它:
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("java -cp scala-library.jar;. Hello");
虽然我认为代码运行,但它并不像我想的那样与Java程序交互。例如,当运行Scala程序(在Java中)时,如果Scala程序希望用户在控制台中键入字符串,那么Java程序应该基本上做同样的事情。
感谢任何指导。
答案 0 :(得分:2)
最简单的方法可能只是使用一个小型的包装器库来处理类路径等事情。例如,有一个小型库Twitter Util-Eval(source)。
以下是一个例子:
package foo;
import com.twitter.util.Eval;
public class Test {
public static void main(String[] args) {
final Eval eval = new Eval();
final int result = eval.apply("3 + 4", true);
System.out.println("Result: " + result);
}
}
如果你想烘焙自己的编译器和运行器包装器,这需要更多,你需要编译成虚拟文件,然后将它们加载到类加载器中(参见例如here和{{3 }})。