我无法加载我捆绑在一个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的宝石 - 即rake
和sources
- 并且它们以相同的方式失败,所以我认为这是我们的问题环境而不是JRuby 本身。
我不确定此处包含哪些内容会有所帮助,所以建议表示赞赏。