繁体   English   中英

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

[英]Compile and Run Scala File within a Java Program

我正在开发一个 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 程序本质上应该做同样的事情。

任何指导表示赞赏。

最简单的方法可能只是使用一个小型包装库来处理类路径等。例如,有一个小型库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);
  }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM