2

速度を上げるために、Scala で比較的重い数を処理する Rails アプリの一部を書き直そうとしています。最終的には、バックグラウンドで実行されている scala デーモンによってすべての処理を実行し、フロントエンドに Rails を使用するだけの計画ですが、それまでの間、遅いコードのビットとピースを書き直して、同期的に呼び出すことができるようにしたいと考えています。ルビー。

このため、RJB (JRuby は使用できません) を調べていて、最終的には Java Bytecode にコンパイルされるので、scala でも使用できることを期待しています。すでにこれまたは同様のことを行っているが何も思いつかない人を見つけることができるかどうかを確認するために、私は周りにグーグルを持っていました。

私の最初の素朴な試みは、テスト scala クラスをコンパイルして jar にパッケージ化し、次のように Rjb を使用してロードすることでした。

Rjb::load("#{Rails.root}/lib/scala/scala-tester-1.0-SNAPSHOT.jar")
MyClass = Rjb::import('com.mydomain.MyClass')

しかし、これはjava.lang.NoClassDefFoundError: com/mydomain/MyClass.

標準の Java クラスのインポートをテストしましたが、正常に動作scala.IntしましたNoClassDefFoundError。この種の問題は、クラスパスに含まれていないscalaライブラリにある可能性があることを私に示唆していますか? しかし、Java クラスパスの果てしない頭痛に対処しなければならなかったのはかなり久しぶりなので、この種の問題を診断して修正するのはかなり苦手です。

それで、誰かがこれをしましたか?そうでない場合、私の勘は正しいのでしょうか? 助言がありますか?それとも、このアプローチがまったく機能しないことを意味する、私が考えていないことはありますか?

編集:少し間違った構文を使用していたことに気付きました。次のような構文を使用して、テスト jar をロードすることができました。

Rjb::load(classpath = "#{Rails.root}/lib/scala/scala-tester-1.0-SNAPSHOT.jar", jvmargs=[]) 

java.lang.NoClassDefFoundError: scala/ScalaObjectしかし、scala ライブラリのロードに間違いなく失敗していることを示唆する別のエラーで失敗します。

4

1 に答える 1

2

私はそれを次のもので動作させることができました:

RJB_LOAD_PATH = ["#{ENV['SCALA_HOME']}/lib/scala-library.jar", "#{Rails.root}/lib/scala/scala-tester-1.0-SNAPSHOT.jar"].join(File::PATH_SEPARATOR)
RJB_OPTIONS = []

Rjb::load(RJB_LOAD_PATH, RJB_OPTIONS)

このコードをイニシャライザーに入れるつもりですが、それでも少しハッキーなようで、誰かがもっときちんとした提案があれば聞いてうれしいです。

于 2012-02-28T12:42:40.040 に答える