JRuby を介して Java アプリケーションに記述した ruby gem の機能を公開しようとしています。JRuby でうまく動作しないネイティブ拡張 bson_ext の代わりに、jruby に bson-1.8.5-java gem をロードさせるのに問題があります。私の目標は、Ruby gem に最小限の変更を加えることです。そのため、Ruby コードに Java クラスをインポートしたくないと考えています。
RubyファイルをJavaクラスにコンパイルした後、彼らは呼び出していますrequire 'mongo'
public class Goose extends RubyObject {
private static final Ruby __ruby__ = Ruby.getGlobalRuntime();
private static final RubyClass __metaclass__;
static {
String source = new StringBuilder("require 'mongo'\n" +
"\n" +
"class Goose\n" +
" def initialize\n" +
...
__ruby__.executeScript(source, "goose.rb");
...
Java からクラスを呼び出すと、BSON 拡張機能がロードされていないというエラーが表示されて失敗します。
問題は次のように要約できます
このチュートリアルに従って、mongo と bson-java の gem を jar しました。
$ jruby -S gem install -i ./my-gems mongo --no-rdoc --no-ri
Fetching: bson-1.8.5-java.gem (100%)
Fetching: mongo-1.8.5.gem (100%)
Successfully installed bson-1.8.5-java
Successfully installed mongo-1.8.5
2 gems installed
$ jar cf my-gems.jar -C ./my-gems .
そして、my-gems.jar を Eclipse プロジェクトのクラスパスに追加しました。
次に、必要な評価をテストするために簡単なメインを実行しました
public static void main(String[] args) {
System.setProperty("org.jruby.embed.compat.version", "JRuby1.9");
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("jruby");
try {
engine.eval("require 'mongo'");
} catch (ScriptException e) {
e.printStackTrace();
}
}
どの出力
** Notice: The BSON extension was not loaded. **
For optimal performance, use of the BSON extension is recommended. To
enable the extension make sure ENV['BSON_EXT_DISABLED'] is not set.
Exception in thread "main" java.lang.ExceptionInInitializerError at JavaRubyTest.main(JavaRubyTest.java:27)
Caused by: org.jruby.exceptions.RaiseException: (NameError) cannot load Java class org.bson.types.ObjectId
...
ただし、require 'mongo'
jirb から実行すると、ロードされます。
ポインタはありますか?