Использование RJB для вызова кода Scala из Ruby - PullRequest
2 голосов
/ 28 февраля 2012

Я собираюсь начать переписывать кусочки нашего приложения Rails, которые делают сравнительно тяжелые вычисления в Scala для скорости. В конечном итоге планируется, что вся обработка будет выполняться демоном scala, работающим в фоновом режиме, и просто использовать Rails для внешнего интерфейса, но пока что я хочу иметь возможность переписывать куски более медленного кода и синхронно вызывать их из рубин.

По этой причине я смотрю на RJB (я не могу использовать JRuby) в надежде, что я смогу использовать его и со Scala, так как в конце концов он компилируется в байт-код Java , У меня был гугл, чтобы узнать, смогу ли я найти кого-то, кто уже сделал это или подобное, но ничего не придумал.

Моя первоначальная, наивная попытка состояла в том, чтобы просто скомпилировать и упаковать тестовый класс 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 не включены в classpath? Но прошло довольно много времени с тех пор, как мне приходилось сталкиваться с бесконечными головными болями путей к классам Java, поэтому я довольно озабочен диагностикой и устранением подобных проблем.

Так, кто-нибудь делал это? Если нет, мой догадка звучит правильно? Какие-либо предложения? Или что-то, о чем я не думаю, будет означать, что этот подход вообще не будет работать?

РЕДАКТИРОВАТЬ: понял, что я использовал слегка неправильный синтаксис. Теперь мне удалось заставить его загрузить мою тестовую флягу с использованием следующего синтаксиса:

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

, но не с другим java.lang.NoClassDefFoundError: scala/ScalaObject, который предполагает, что он определенно не может загрузить библиотеки scala.

1 Ответ

2 голосов
/ 28 февраля 2012

Я получил его для работы со следующим:

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)

Собираюсь поместить этот код в инициализатор, но он все еще выглядит немного хакерским и был бы рад услышать, если у кого-нибудь есть более аккуратные предложения.

...