[英]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.