OSGI束惰性激活

OSGI束惰性激活,osgi,osgi-bundle,knopflerfish,Osgi,Osgi Bundle,Knopflerfish,我对这个(OSGI)非常陌生,尝试做一些简单的例子。我不能让懒散的活动起作用。我知道有一些蓝图可以解决这样的问题,但在开始之前,我认为学习一些基础知识会很好 Bundle DataService: Manifest-Version: 1.0 Bundle-Version: 1.0.0 Bundle-Name: DataService Bundle-ManifestVersion: 2 Bundle-Activator: DataServic

我对这个(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 捆绑数据服务: 清单版本:1.0 捆绑包版本:1.0.0 捆绑包名称:DataService 软件包版本:2 Bundle激活器:DataService.Activator 导入包:org.osgi.framework Bundle SymbolicName:DataService 导出包:数据服务;version=“1.0.0” 捆绑包激活策略:惰性 捆绑数据服务客户端: 清单版本:1.0 捆绑包版本:1.0.0 捆绑包名称:DataServiceClient 软件包版本:2 捆绑激活器:DataServiceClient.Activator 导入包:org.osgi.framework,DataService;version=“[1.0.0,1.0.0]” Bundle SymbolicName:DataServiceClient 好的,我已经更改了代码,但仍然不走运

外部应用程序,安装捆绑包,启动框架,然后仅启动DataServiceClient捆绑包。 无法访问任何捆绑包类

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(); } } 文件bundleDir=新文件(“./bundles/”); 字符串[]bundleResources=bundleDir.list(); 对于(字符串bundleResourcePath:bundleResources){ File bundleResource=新文件(bundleDir,bundleResourcePath); InputStream bs=新文件InputStream(bundleResource); mFramework.getBundleContext().installBundle(bundleResource.getName(),bs); } mFramework.start(); bl=MFramew.getBundleContext().getBundles(); 对于(束b:bl){ 如果(b.getBundleId()!=0和&b.getSymbolicName()包含(“DataServiceClient”){ b、 start(); } } 以下是DataServiceClient的开始:

System.out.println("DataServiceClient Start"); IDataService service = new DummyService(); System.out.println(service.getData()); System.out.println(“DataServiceClient启动”); IDataService=new DummyService(); System.out.println(service.getData()); 下面是“DataService”捆绑包中的DummyService类

公共类DummyService实现IDataService{ @凌驾 公共字符串getData(){ 返回“DummyService数据”; } } 以下是“数据服务”捆绑包的开始:

System.out.println(“数据服务启动”); 我得到的输出:

DataServiceClient Start DummyService Data DataServiceClient启动 DummyService数据 然而,我希望看到:

DataServiceClient Start DataService Start DummyService Data DataServiceClient启动 数据服务启动 DummyService数据 一点方程式

延迟激活

延迟激活是一种生命周期策略,它要求在第一次成功请求从捆绑包加载类时必须激活捆绑包。

然而,由于它不起作用,我想我完全误解了惰性激活的概念,或者我做错了什么

除非我显式地为DataService bundle调用start,否则它似乎不会为DataService bundle调用Activator.start。这是我没有得到的自动取款机


谢谢你的时间,你确定你的激活器没有被调用吗。我经常遇到这样的情况,激活器被调用,但经历了OSGi吞下的异常。你能试一下激活器第一行的println吗?开始检查。在这种情况下,带有日志记录的try-catch也很有用


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

调用DummyClient.GetData()时不清楚发生了什么。您说它调用DataService捆绑包中的一个类,但是如何调用呢??DataService是一个普通的捆绑包,您的代码是主要的Java启动器应用程序,在OSGi中,“外部”应用程序无法静态地依赖于普通捆绑包

无论如何,即使您可以这样做,您也可以在包启动之前执行这行代码。在bundle启动之前,肯定不会调用bundle activator!!我希望在第36行调用activator,即在每个bundle上调用
bundle.start()

但是真的。。。你到底想干什么??
Bundle ActivationPolicy:lazy
标志几乎完全没有用处。我有八年的OSGi经验,出于遗留原因,我只在EclipseRCP应用程序中使用过此设置。除非您正在编写Eclipse插件或Eclipse RCP应用程序,否则不应在OSGi中使用
Bundle ActivationPolicy:lazy


在OSGi中实现延迟(或“即时”)实例化的正确方法是使用声明性服务(Declarative Services,DS)。DS发布的所有服务对象都是在客户机首次尝试调用时(而不是在注册时)按需实例化的。您无需执行任何特殊操作即可启用此功能。

关于更改的代码。。。您从未实际启动bundle
DataServiceClient
,因此无法调用其激活器。您已按名称明确地将其从启动捆绑包的循环中排除。OSGi只会在使用
bundle.start()启动的bundle上调用
BundleActivator

这是一个被广泛误解的观点。。。OSGi从不自动启动Bundle,即使启用了
Bundle ActivationPolicy:lazy
标志

您可能打算按如下方式启动捆绑包:

bundle.start(Bundle.START_ACTIVATION_POLICY).
事实上,您可以对所有bundle执行此操作,而不是任意启动bundle的子集


但是,我必须再次重申我在另一份答复中提出的观点。使用
Bundle ActivationPolicy:lazy
是没有意义的,除非您正在开发Eclipse RCP应用程序,在这种情况下,您有时不得不出于愚蠢的遗留原因使用它。

Hi Neil,为什么lazy activation没有用?我修改了代码,仍然没有成功。这似乎是一个非常基本的概念,但我想我遗漏了一些东西。我没有说懒惰的activa DataServiceClient Start DataService Start DummyService Data
bundle.start(Bundle.START_ACTIVATION_POLICY).