Java OSGi-如何通过现有的bndrun文件运行新的捆绑包
我是JavaOSGi框架的新手,继承了一个需要新功能的项目。该项目有多个bundle,并设置为在Eclipse上运行,包含所有必需的插件等 有一个start.bndrun文件,当通过Eclipse上的“run OSGi”选项运行时,它会启动主应用程序,并通过其Java OSGi-如何通过现有的bndrun文件运行新的捆绑包,java,osgi,osgi-bundle,bnd,bndtools,Java,Osgi,Osgi Bundle,Bnd,Bndtools,我是JavaOSGi框架的新手,继承了一个需要新功能的项目。该项目有多个bundle,并设置为在Eclipse上运行,包含所有必需的插件等 有一个start.bndrun文件,当通过Eclipse上的“run OSGi”选项运行时,它会启动主应用程序,并通过其activate()函数运行所有捆绑包 问题是,当我创建我自己的简单组件和捆绑包(如下所示)时,例如providerImpl,导出所需的包等,并尝试将其添加到start.bndrun的“runbundles”选项中,它似乎无法运行 pack
activate()
函数运行所有捆绑包
问题是,当我创建我自己的简单组件和捆绑包(如下所示)时,例如providerImpl,导出所需的包等,并尝试将其添加到start.bndrun的“runbundles”选项中,它似乎无法运行
package Test;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@Component
public class ExampleProviderImpl
{
@Activate
void activate()
{
System.out.println("HELLO FROM ExampleProviderImpl.class");
System.out.println("HELLO FROM ExampleProviderImpl.class");
System.out.println("HELLO FROM ExampleProviderImpl.class");
System.out.println("HELLO FROM ExampleProviderImpl.class");
System.out.println("HELLO FROM ExampleProviderImpl.class");
}
}
我猜想
它只是好像没有运行
package Test;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@Component
public class ExampleProviderImpl
{
@Activate
void activate()
{
System.out.println("HELLO FROM ExampleProviderImpl.class");
System.out.println("HELLO FROM ExampleProviderImpl.class");
System.out.println("HELLO FROM ExampleProviderImpl.class");
System.out.println("HELLO FROM ExampleProviderImpl.class");
System.out.println("HELLO FROM ExampleProviderImpl.class");
}
}
你的意思是什么都没印出来。如果是这样的话,很可能是因为组件在默认情况下是惰性的,在需要它们之前不会被激活。尝试向注释中添加immediate=true
,以强制激活组件:
@组件(立即=真)
公共类示例ProviderImpl
更新
以上假设捆绑包已在运行时正确添加、解析和启动。检查是否确实如此
- 确保捆绑包已正确添加到
运行要求中
- 确保选中了“保存时自动解析”,或单击“解析”按钮
- 确保解决方案不会导致错误,并将您的捆绑包添加到
部分李>运行捆绑包
- 启动环境/部署捆绑包后,转到Gogo shell并发出
命令。确保您的捆绑包处于活动状态lb
如果在这些步骤中出现问题,请使用所有相关信息更新问题。谢谢您的建议。但是在我的情况下它仍然不起作用(没有打印任何内容)。向bndrun文件添加新捆绑包/组件的正确方法是什么?我将新组件放在“运行要求”和“运行包”部分扫描您是否使用
start.bndrun
文件的内容更新您的问题?通常,您只需要将捆绑包添加到运行需求中
,然后解析。冲突解决程序应该更新运行bundles
部分。@MilenThanks再次感谢您的帮助。正如您所解释的,我已将我的新包添加到“运行要求”部分。选中“保存时自动解析”。当我选择Resolve时,我的bundle显示在那里,也显示在“runbundles”中,所以看起来它可以工作了。然而,我仍然没有得到任何打印出来。当我检查Felix控制台时,我的包没有显示出来,就像不存在一样。我还向组件添加了“(immediate=true)”,在该主项目中还有一个bnd.bnd文件以及bndrun文件。捆绑包是否也应该添加到该bnd.bnd文件的“运行要求”部分?当我这样做时,它没有解决问题,出现了诸如“无法找到满足以下要求的功能”之类的错误:“没有。通常在bnd.bnd
文件中没有“运行要求”。这些用于配置捆绑包,而不是运行时。如何启动运行时?能否检查您的类是否真的在bundle jar中结束?另一件要检查的事情是。您是否正在运行scr(声明性服务扩展程序)捆绑包?您是在Felix还是Equinox上运行?在Equinox中,您必须将标题“Bundle ActivationPolicy:lazy”添加到bnd文件中。否则DS/SCR将不会自动启动捆绑包和服务。