Jruby&;OSGi-如何协同工作?
我想创建一个简单的osgi包来运行ruby源文件,所以我使用jruby complete 运行jruby文件的包Jruby&;OSGi-如何协同工作?,osgi,jruby,Osgi,Jruby,我想创建一个简单的osgi包来运行ruby源文件,所以我使用jruby complete 运行jruby文件的包 包装激活器; 导入org.jruby.embed.ScriptingContainer; 公共班机{ public void runRubySource(字符串[]args){ 试一试{ System.out.println(“jrubyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy; ScriptingCo
包装激活器;
导入org.jruby.embed.ScriptingContainer;
公共班机{
public void runRubySource(字符串[]args){
试一试{
System.out.println(“jrubyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy;
ScriptingContainer=新建ScriptingContainer();
container.setArgv(args);
runScriptlet(“需要'ruby/test.rb'”);
}捕获(例外情况除外){
System.out.println(例如getMessage());
}
}
}
使用上述包的包
包装激活器;
进口激活剂.Main;
导入org.jruby.embed.ScriptingContainer;
导入org.osgi.framework.BundleActivator;
导入org.osgi.framework.BundleContext;
公共类测试实现了Activator{
@凌驾
public void start(BundleContext)引发异常{
//TODO自动生成的方法存根
Main m=新的Main();
字符串[]args={“-c”,“c:\\fileconfig.conf”};
m、 runRubySource(args);
}
@凌驾
公共void stop(BundleContext上下文)引发异常{
//TODO自动生成的方法存根
}
}
使用maven构建osgi捆绑包的POM文件
4.0.0
com.insight
)
开始我的包
现在它引发了一个错误:
(LoadError)没有要加载的文件--jruby/jruby.rb
当然,jruby/jruby.rb包含在jruby-complete.jar中,而不是我的示例包中
所以,我必须做的是???在OSGI中,脚本通常有点不同,因为脚本可以是/是运行时,OSGI希望您在构建时指定内容(从链接线程中提取)。对于使用JRuby编写脚本,最好使用JSR-223来加载引擎,因为已经有工作将这两种稍微不兼容的技术结合起来
下面是一个类似的线程,讨论如何在OSGI中使用JSR-223并提供一些解决方案:
(LoadError)没有要加载的文件--jruby/jruby.rb
我想你可能是腐败了。
顺便说一句,jruby complete已经是一个OSGI捆绑包了,所以不用包装就可以尝试同样的方法:它肯定能够加载自己的类
但是,下一步:
runScriptlet(“需要'ruby/test.rb'”)
您要求jruby捆绑包中的一个类从另一个捆绑包加载资源。
问题是jruby complete不知道您的捆绑包,因为它没有通过正常的OSGI机制连接到它
因此,您需要某种形式的反向查找机制,使Jruby捆绑包能够定位其他捆绑包中的资源/类,而无需向Jruby捆绑包中添加直接依赖项(RequireHandle或ImportPackage)(因为如果您希望能够从其他捆绑包加载,或者在其他上下文中重用Jruby,那么这将是不可伸缩的)
我正在使用EclipseEquinox进行类似的设置,所以我被一些讨厌的东西“宠坏了”,比如。除了特定的容器之外,它还有自己的容器,但对我来说已经足够好了
目前,BuddyPolicy=Global的一个通用OSGI“等价物”似乎是
然而,它只是作为最后的手段,不如上述方法灵活
以上两项都涉及到在Jruby包的清单中添加一行(同样是Jruby-complete.jar,但我碰巧将整个内容重新打包为org.Jruby)
更好的解决方案可能是JRuby自己的解决方案,您可以将加载包传递到类中,如下所示:
包装激活器;
导入org.jruby.embed.OSGIScriptingContainer;
公共班机{
public void runRubySource(字符串[]args){
试一试{
System.out.println(“jrubyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy;
ScriptingContainer=new OSGIScriptingContainer(Activator.getBundle());//
container.setArgv(args);
runScriptlet(“需要'ruby/test.rb'”);
}捕获(例外情况除外){
System.out.println(例如getMessage());
}
}
}
我还没有尝试过,但我将更改设置,因为这似乎是正确的方法。谢谢,OSGIScriptingContainer解决了我的问题:)