以编程方式启动OSGi文件夹包

时间:2015-04-17 19:23:07

标签: java eclipse osgi equinox

我在Eclipse中创建了一个OSGi Bundle项目,我想从另一个Java项目以编程方式启动它。

这就是我要做的事情:

FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
Map<String,String> config = new HashMap<String,String>();
Framework framework = frameworkFactory.newFramework(config);
framework.start();
BundleContext context = framework.getBundleContext();
Bundle bundle = context.installBundle("file:./test.ServiceA");
bundle.start();

但我有这个错误

Exception in thread "main" org.osgi.framework.BundleException: Error loading bundle activator.
...
Caused by: java.lang.ClassNotFoundException: test.servicea.Activator cannot be found by test.ServiceA_1.0.0.qualifier

如果我安装插件jar而不是指向文件夹

,一切都有效
Bundle bundle = context.installBundle("file:./tmp/test.ServiceA_1.0.0.201504172035.jar");       

但我想直接调试Eclipse项目文件夹。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

将“reference:”放在URL的开头。通过这样做

  • 捆绑包的内容不会被复制到OSGi容器的工作(或缓存)文件夹中,但会从原来的位置使用
  • 文件夹可以作为OSGi包安装

这不是规范的一部分,但适用于Equinox和Felix(也可能适用于Knopflerfish)

根据您的示例:

Bundle bundle = context.installBundle("reference:file:./test.ServiceA");

根据评论进行修改

由于MANIFEST.MF文件位于 ./ test.ServiceA 中,但已编译的类位于 ./ test.serviceA / bin 下,“Bundle -Classpath:bin“ MANIFEST标头必须是临时提供的,直到从文件夹安装软件包。在发布之前,必须删除标头,因为类将位于生成的JAR的根目录中。