2010年04月13日 00:09

Scalaインタープリタのエラー scala.tools.nsc.MissingRequirementError その2

ScalaのインタープリタをJavaのプログラムから利用しようと、scala.tools.nsc.Interpreterinterpret を呼び出すと出てくる以下のエラー。

scala.tools.nsc.MissingRequirementError: object scala not found.
  at scala.tools.nsc.symtab.Definitions$definitions$.getModuleOrClass(Definitions.scala:514)

Scalaがクラスファイルを見つけられるように、jarファイルのありかをScalaに教えてあげないといけないらしい。Scalaのclasspathの解説に説明があった。

英語なので全部は読めていないのだが、要するにScalaにクラスパスを教えなきゃいけない。jarファイルのありかはそもそもJava起動時に教えているので、なんでエラーが出るのかは不明だが(Eclipseから起動しているからなのか)、解決方法としては、Java起動時のコマンドラインオプションに -Dscala.home="C:\scala-2.8.0.Beta1-prerelease" を付ける方法もあるが、以下のコードでもできた。こっちの方法だとScala関連だけでなく、そのほかのライブラリやユーザ定義のクラスを呼び出そうとしたときのエラーも解決できる。

scala.tools.nsc.Settings settings = new scala.tools.nsc.Settings();
settings.classpath().value_$eq(System.getProperty("java.class.path"));
scala.tools.nsc.Interpreter interpreter = new scala.tools.nsc.Interpreter(settings, out);
interpreter.interpret(sourceCode);

value_$eq という変な名前のメソッドは、Scalaでは value_= という名前のメソッドで、valueというプロパティのセッターのようなものになる。

クラスファイルはクラスローダが探してくれるのになぜScalaに改めてクラスパスを教えなきゃいけないかというと、ここからは推測だが、Scalaはpackage名の途中でもそれがpackage名だと分かる必要があるから。

例えば、import org._ と書けば、名前がorg.で始まるパッケージが存在することをScalaは確認する必要がある。jarファイルの中を探索すればorgというディレクトリがあってその中にさらにディレクトリがあるので、orgがパッケージ名の一部だと分かる。orgというパッケージもクラスもあるわけではないので、jarファイルを見ない限り import org._ の妥当性を検証できない。もちろん org.w3c.dom.Element というクラス名を見れば、そのクラスはクラスローダで読み込めるので、結果としてorgがパッケージ名の一部だと分かるが、Scalaの場合は、それをクラスを読み込む前に分かるようにしなければいけない。Javaの場合は、パッケージのインポートはパッケージのフルネームかクラス名のフルネームで指定する必要があるので、このようなことがない。

この認識で合ってるかな。
タグ:scala java
カテゴリ:テック
2010/04/13 Tue 00:09 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/146372375
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。