4

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

我们的目的是将 gems 添加到正确的META-INF/jruby.home子目录并重建jruby-complete.jar文件,然后该文件是该项目的依赖项。

例如,cartesiangem 安装在此处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 中运行了所有通过的测试,并且我向通过以下方式执行的 Ruby 代码添加了一些调试输出ScriptingContainer.runScriptlet()

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 的方法,比如构建仅包含 gem 的 jar 或将 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——即rakesources——它们以同样的方式失败,所以我认为这是我们环境的问题,而不是 JRuby本身的问题。

我不确定在此处包含其他内容会有所帮助,因此非常感谢您的建议。

4

0 回答 0