簡體   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