次のインスタンスを使用して、プログラムで Scala ファイルをコンパイルしようとしていますGlobal.Run
。
val settings = new Settings
val reporter = new ConsoleReporter(settings)
val compiler = new Global(settings, reporter)
val run = new compiler.Run // MissingRequirementError
run compile List(path)
残念ながら、私はMissingRequirementError
言います:
コンパイラ ミラー内のオブジェクト scala.runtime が見つかりません
だから私の質問は、クラスを使用してプログラムでファイルをコンパイルする方法Run
、またはここで何が間違っているのですか?
settings
動作させるために を変更できるかどうかを調べてみました。実際には、Scala ファイルにあるクラスのリストが必要ですがpath
、完全に実行可能な出力である必要はありません。したがって、シンボルが未解決のままであれば問題ありません (コンパイラ フェーズのサブセットを実行できれば)。
私もWriting Scala Compiler Pluginsにいますが、 Compiler Run オブジェクトをインスタンス化して実行できるのであれば、このソリューションを好むでしょう。私も偶然出くわしました Scalaコンパイラは再入可能ですか? (同様のコード、別の質問)、私が考えているように機能する可能性があると思います。
編集 1: Scala JAR をに追加しましたtoolcp
(絶対パスを使用したサンプル コードだけです!)
コメントによると、scalac.bat
のクラスパス生成スクリプトを Scala コードに適合させました。
// scalac.bat
// if "%_TOOL_CLASSPATH%"=="" (
// for %%f in ("!_SCALA_HOME!\lib\*") do call :add_cpath "%%f"
// for /d %%f in ("!_SCALA_HOME!\lib\*") do call :add_cpath "%%f"
// )
new File("C:\\Program Files\\scala\\lib").listFiles.foreach(f => {
settings.classpath.append(f.getAbsolutePath)
settings.toolcp.append(f.getAbsolutePath)
})