无法从OSGi包中的JRuby jar文件加载gem

时间:2013-02-26 02:12:41

标签: maven rubygems osgi jruby

我无法加载我捆绑在一个jar中的gem,然后将其作为OSGi包加载。我是Ruby程序员,所以我对OSGi,Maven或JRuby不太熟悉。

我们的目的是将gems添加到正确的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"]

我已经看到了几种不同的加载宝石的方法,比如构建只包含宝石的罐子或者将宝石安装到文件系统并更改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的宝石 - 即rakesources - 并且它们以相同的方式失败,所以我认为这是我们的问题环境而不是JRuby 本身

我不确定此处包含哪些内容会有所帮助,所以建议表示赞赏。

0 个答案:

没有答案