Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OSGi-如何通过现有的bndrun文件运行新的捆绑包_Java_Osgi_Osgi Bundle_Bnd_Bndtools - Fatal编程技术网

Java OSGi-如何通过现有的bndrun文件运行新的捆绑包

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

我是JavaOSGi框架的新手,继承了一个需要新功能的项目。该项目有多个bundle,并设置为在Eclipse上运行,包含所有必需的插件等

有一个start.bndrun文件,当通过Eclipse上的“run OSGi”选项运行时,它会启动主应用程序,并通过其
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将不会自动启动捆绑包和服务。