OSGI:是否可以在不激活bundle的情况下导入包?

时间:2012-07-18 09:03:42

标签: java osgi

是否可以在不调用其激活器的情况下从另一个包中导入包?此包不是任何包初始化所必需的。我知道这是糟糕的设计,但我无法改变它。

例外:

org.osgi.framework.BundleException: The activator my-package.Activator for bundle my-bundle is invalid
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:157)  
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:750)  
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:352)  
at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:370)  
at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1068)  
at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:557)  
at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:464)
at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:248)  
at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:445)  
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:220)  
at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:330)

3 个答案:

答案 0 :(得分:7)

是的,它有可能,OSGi规范允许,甚至不是不好的做法。

让我看看我是否理解你。 你有捆绑包A,它在其清单中导出一个包,捆绑包B,它导入它。 你想在不启动捆绑A的情况下这样做,对吗?

是的,这是可能的。如果bundle A的唯一目的是提供一些java类和包,比如库,它甚至可能没有激活器。根据OSGi规范,捆绑包进入解析状态后,捆绑包的所有导出包都可用于其他捆绑包(即,它已安装,依赖关系已解决,但尚未启动)。

使用捆绑A的捆绑包B的状态无关紧要。捆绑包B是否使用导入包中的类也无关紧要。你也不需要做任何特别的事情,只需用通常的OSGi方式声明依赖:

捆绑清单: Export-Package:com.acme.aaa

捆绑B清单: Import-Package:com.acme.aaa

您应该安装bundle A并检查它是否已进入RESOLVED状态,即它是否在系统中满足其依赖性。如果是,您可以将其保留,并在捆绑包B中使用。

上述人员可能会混淆使用OSGi中的SERVICE导入包。提供SERVICE(即“实时”java对象)需要启动bundle并调用其激活器。只是导出包不会。

答案 1 :(得分:0)

根据OSGi spec,这是不可能的。你唯一的选择是急切和懒惰的激活,两者都发生在你观察捆绑中的任何一个类之前。

BTW如果您实际上只是在没有引用任何类的情况下导入包,则不会激活延迟激活的包。我怀疑这是你的情况。

答案 2 :(得分:0)

如果捆绑包处于已解析状态,您可以导入其包,它尚未启动(但是?)。

所以:只需安装捆绑包,就不要启动它。我想这取决于上下文,如果这是一个好主意。