2

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 から実行すると、ロードされます。

ポインタはありますか?

4

0 に答える 0