当前位置: 首页 > 知识库问答 >
问题:

OSGI捆绑延迟激活

寇坚成
2023-03-14

我对这个(OSGI)真的是新手,试图做简单的例子。我不能让懒惰的修辞奏效。我知道有一些解决这些问题的蓝图,但在开始之前,我认为学习一些基础知识是很好的。


    Bundle DataService:
    Manifest-Version: 1.0  
    Bundle-Version: 1.0.0  
    Bundle-Name: DataService  
    Bundle-ManifestVersion: 2  
    Bundle-Activator: DataService.Activator  
    Import-Package: org.osgi.framework  
    Bundle-SymbolicName: DataService  
    Export-Package: DataService;version="1.0.0"  
    Bundle-ActivationPolicy: lazy  

    Bundle DataServiceClient:  
    Manifest-Version: 1.0  
    Bundle-Version: 1.0.0  
    Bundle-Name: DataServiceClient  
    Bundle-ManifestVersion: 2  
    Bundle-Activator: DataServiceClient.Activator  
    Import-Package: org.osgi.framework, DataService;version="[1.0.0,1.0.0]"  
    Bundle-SymbolicName: DataServiceClient

好吧,我已经改变了我的代码,但仍然没有运气。

外部应用程序,install bundles,启动framework,然后只启动DataServiceClient Bundle。不能访问任何bundle类。


    File bundleDir = new File("./bundles/");  
    String[] bundleResources = bundleDir.list();  
    for(String bundleResourcePath : bundleResources) {  
        File bundleResource = new File(bundleDir, bundleResourcePath);  
        InputStream bs =new FileInputStream(bundleResource);  
        mFramework.getBundleContext().installBundle(bundleResource.getName(), bs);  
    }  
    mFramework.start();  

    bl = mFramework.getBundleContext().getBundles();  
    for(Bundle b : bl) {  
        if (b.getBundleId() != 0 && b.getSymbolicName().contains("DataServiceClient")) {  
            b.start();  
        }           
    }   


以下是DataServiceClient的开头:


    System.out.println("DataServiceClient Start");
    IDataService  service = new DummyService();
    System.out.println(service.getData());




    public class DummyService implements IDataService {

        @Override
        public String getData() {
            return "DummyService Data";
        }
    }

    System.out.println("DataService Start");

我得到的输出是:


    DataServiceClient Start
    DummyService Data

然而,我希望看到:


    DataServiceClient Start
    DataService Start
    DummyService Data

来自http://www.osgi.org/design/lazystart的一点意见

你的时间是Thx

共有1个答案

晋骏喆
2023-03-14

你确定吗,你的激活器真的没有被调用。我经常遇到这样的情况,激活器被调用,但经验丰富,异常被OSGi吞噬。你能在激活器的第一行尝试一个println吗?开始检查这个。在这种情况下,使用日志记录的try catch也很有用。

顺便说一句。用大写字母命名包是非常不寻常的。不确定这是否是一个问题,但我会避免这一点。

 类似资料:
  • 我已经用声明性服务(DS)组件定义定义了一个OSGi包(),指定了一个导出的服务、一个激活方法和一个停用方法。 在Activate方法的主体中,我需要访问一个文件,该文件不在文件系统中,但绑定在OSGi捆绑包中。在activate方法期间,使用。 这基本上是可行的,但有一种情况是不可行的。在我的应用程序中,

  • 我有几个OSGi捆绑包,它们是在Eclipse中使用普通清单管理依赖项和Maven Tycho的外部构建构建构建的。 在Equinox上运行Eclipse内部的捆绑包工作正常。用第谷建造它们效果很好。 现在我想使用Tycho Surefire运行集成测试,为此我创建了一个简单的测试包,其中包含一些基本测试。测试中的bundle依赖于OSGi容器中的其他bundle和一些小的启动级别调整,以便正确运

  • 我创建了一个依赖于SLF4J的捆绑包,因此使用Logback来实现OSGI。这一切都捆绑起来并安装正常,但是当我开始捆绑时,我得到以下异常: org.osgi.framework.BundleException: 無法解析 com.felix.test [20](R 20.0): missing requirements [com.felix.test [20](R 20.0)] osgi.wir

  • 我使用EclipseIndigo使用OSGiJava框架开发了一些包。有一个主捆绑包,它依赖于其他捆绑包,并且具有要运行的主程序。如果我尝试在Eclipse中运行所有捆绑包,一切都正常工作,但是如果我将每个捆绑包保存为一个JAR,并在命令行中启动OSGi框架,当我尝试启动主捆绑包时,会出现异常<code>NoClassDefFoundError。找不到的类是依赖项。包的其余部分处于活动状态,主包刚

  • 我在Apache Felix上开发了一个OSGI捆绑包。捆绑包公开不同的API来实时管理YouTube事件。捆绑包服务将通过REST服务公开,并将由用户通过Web浏览器(chrome、safari、mozilla)使用。 我为该帐户生成凭据Google(client_secret和client_id)并将其保存在文件中,然后我的代码使用此凭据并正常工作。 我使用这个类(在youtube文档中找到)

  • 问题内容: 我正在尝试在Eclipse中创建一个简单的插件。运行应用程序时,我在日志文件中看到此错误: org.osgi.framework.BundleException:捆绑包org.xy的激活器捆绑包org.xy的激活器无效。 您对此错误有任何想法吗? 问题答案: 检查你的 部分 如果未正确指定最终二进制结果中应包含的内容,它将无法正常工作。检查.class文件是否在MANIFEST.MF所