1

JRuby にジェムがインストールされているときに Java クラスを作成し、それを実行することで、C 拡張ジェムに JRuby サポートを追加しようとしています。問題のコードはこのブランチにあり、重要なファイルはJava クラスであり、 JRuby で使用するときにそれをロードするコードです。

この時点で、gem が正しく構成されていることを確認し、仕様に失敗することを完全に期待しています。

rspec(またはIRBのgem)を実行しようとすると、次のバックトレースが表示されます

NameError: cannot load Java class com.dockyard.PgArrayParser
  get_proxy_or_package_under_package at org/jruby/javasupport/JavaUtilities.java:54
                      method_missing at /Users/dan/.rbenv/versions/jruby-1.6.7.2/lib/ruby/site_ruby/shared/builtin/javasupport/java.rb:51
                       PgArrayParser at /Users/dan/Projects/dockyard/pg_array_parser/lib/pg_array_parser.rb:6
                              (root) at /Users/dan/Projects/dockyard/pg_array_parser/lib/pg_array_parser.rb:3
                             require at org/jruby/RubyKernel.java:1033
                             require at /Users/dan/.rbenv/versions/jruby-1.6.7.2/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36
                              (root) at /Users/dan/Projects/dockyard/pg_array_parser/lib/pg_array_parser.rb:2
                             require at org/jruby/RubyKernel.java:1033
                             require at /Users/dan/.rbenv/versions/jruby-1.6.7.2/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36
                              (root) at /Users/dan/Projects/dockyard/pg_array_parser/lib/pg_array_parser.rb:1
                             require at org/jruby/RubyKernel.java:1033
                             require at /Users/dan/.rbenv/versions/jruby-1.6.7.2/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36
                              (root) at /Users/dan/Projects/dockyard/pg_array_parser/spec/spec_helper.rb:1
                                load at org/jruby/RubyKernel.java:1058
                     load_spec_files at /Users/dan/Projects/dockyard/pg_array_parser/spec/parser_spec.rb:746
                             collect at org/jruby/RubyArray.java:2331
                     load_spec_files at /Users/dan/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rspec-core-2.10.1/lib/rspec/core/configuration.rb:746
                                 run at /Users/dan/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rspec-core-2.10.1/lib/rspec/core/command_line.rb:22
                                 run at /Users/dan/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rspec-core-2.10.1/lib/rspec/core/runner.rb:69
                             autorun at /Users/dan/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/rspec-core-2.10.1/lib/rspec/core/runner.rb:10
                                call at org/jruby/RubyProc.java:270
                                call at org/jruby/RubyProc.java:224
4

1 に答える 1

1

最近、JRuby の拡張機能を自分で開発したので、実験で見つけた落とし穴のいくつかを以下に示します。

  • Java パッケージは、クラスが配置されている Ruby モジュールと一致する必要があります。PgArrayParserクラスがモジュール内にある場合、クラスはpgarrayparser(すべて小文字) でなければなりません。
  • PgArrayParserEngineクラスをインスタンス化する場合は、 をBasicLibraryService呼び出す必要がありますPgArrayParserEngineService
  • を使用する場合@JRubyMethodは、メソッドの名前を指定します。

私は、この最近の投稿とともに、このテーマに関するヨーコの記事が最も有用であることがわかりました。

ここで、これらのさまざまな要素をプロジェクトに適用しました。IRB からメソッドを呼び出すことができます。最初の仕様に合格しました。

于 2012-09-03T17:58:37.010 に答える