Jruby&;OSGi-如何协同工作?

Jruby&;OSGi-如何协同工作?,osgi,jruby,Osgi,Jruby,我想创建一个简单的osgi包来运行ruby源文件,所以我使用jruby complete 运行jruby文件的包 包装激活器; 导入org.jruby.embed.ScriptingContainer; 公共班机{ public void runRubySource(字符串[]args){ 试一试{ System.out.println(“jrubyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy; ScriptingCo

我想创建一个简单的osgi包来运行ruby源文件,所以我使用jruby complete

运行jruby文件的包

包装激活器;
导入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解决了我的问题:)