OSGi バンドルとしてロードされる jar 内にバンドルした gem をロードする際に問題があります。私は Ruby プログラマーなので、OSGi、Maven、または JRuby にはあまり詳しくありません。
私たちの目的は、gem を正しいサブディレクトリに追加し、ファイルMETA-INF/jruby.home
を再構築することです。これは、このプロジェクトの依存関係です。jruby-complete.jar
たとえば、cartesian
gem は次の場所にインストールされますjruby-complete-gems-1.6.8.1.jar
(元の JRuby jar との混同を避けるためにファイル名を変更しています)。
META-INF/jruby.home/lib/ruby/gems/1.8/gems/cartesian-0.6.7
jar 内にパスが存在することを確認しました。また、すべて合格する JUnit で実行されているテストもあり、ScriptingContainer.runScriptlet()
以下を介して実行されている Ruby コードにいくつかのデバッグ出力を追加しました。
DEBUG: Gem.path: ["file:/home/brandanl/.m2/repository/org/jruby/jruby-complete-gems/1.6.8.1/jruby-complete-gems-1.6.8.1.jar!/META-INF/jruby.home/lib/ruby/gems/1.8", "/home/brandanl/.gem/jruby/1.9"]
したがって、OSGi にロードされてこのエラーが発生し始めるまで、これは設計どおりに機能しているように見えます。
org.jruby.embed.EvalFailedException: (LoadError) no such file to load -- cartesian
at org.jruby.embed.internal.EmbedEvalUnitImpl.run(EmbedEvalUnitImpl.java:136)
at org.jruby.embed.ScriptingContainer.runUnit(ScriptingContainer.java:1263)
at org.jruby.embed.ScriptingContainer.runScriptlet(ScriptingContainer.java:1256)
at com.raritan.polaris.plugins.dynamic.DynamicPluginManager.setPluginLoadPath(DynamicPluginManager.java:123)
at com.raritan.polaris.plugins.dynamic.Activator.start(Activator.java:54)
Ruby のコードは基本的に次のとおりです。
require 'cartesian'
私のデバッグ出力は次のようになります。
DEBUG: Gem.path: ["classpath:/META-INF/jruby.home/lib/ruby/gems/1.8", "/root/.gem/jruby/1.9"]
gem だけを含む jar を構築したり、gem をファイルシステムにインストールして を変更したりするなど、gem をロードするいくつかの異なる方法を見てきましたが、jruby.home
テスト中に機能するため、このアプローチの何が問題なのかを理解したいと思います。私たちのプロジェクト jar には間違いなく が含まれてjruby-complete-gems-1.6.8.1.jar
おり、そのMANIFEST.MF
ファイルには正しいBundle-Classpath
ディレクティブが含まれています。
Bundle-ClassPath: .,scripts,lib/jruby-complete-gems-1.6.8.1.jar
JRuby 1.6.8 にデフォルトでバンドルされている gem を読み込んでみましたが、同じように失敗しました。JRuby 自体の問題ではなく、環境の問題だとrake
思います。sources
ここに含めると他に何が役立つかわかりませんので、提案をいただければ幸いです。