是否可以从另一个包导入包而不调用其激活器?该包不需要任何捆绑初始化。我知道这是糟糕的设计,但我无法更改它。
异常:
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)
最佳答案
是的,这是可能的,这是 OSGi 规范允许的,而且这甚至不是不好的做法。
让我看看我是否理解正确。 您有 bundle A,它在其 list 中导出包,还有 bundle B,它导入它。 您想在不启动 bundle A 的情况下完成此操作,对吗?
是的,这是可能的。如果bundle A的唯一目的是提供一些java类和包,比如库,它甚至可能没有激活器。根据 OSGi 规范,在 bundle 进入已解析状态(即已安装、依赖项已解析,但尚未启动)后, bundle 的所有导出包都可供其他 bundle 使用。
使用 bundle A 的 bundle B 的状态并不重要。 bundle B 是否使用导入包中的类也并不重要。您也不必做任何特殊的事情,只需以通常的 OSGi 方式声明依赖项即可:
bundle A list : 导出包:com.acme.aaa
bundle B list : 导入包:com.acme.aaa
您应该安装bundle A并检查它是否已进入RESOLVED状态,即系统中是否满足其依赖关系。如果是,您可以像这样保留它并在 bundle B 中使用它。
上面的人可能会将导入包与在 OSGi 中使用 SERVICE 混淆。提供服务(即“实时”java 对象)需要启动 bundle 并调用其激活器。仅导出包不会。
关于java - OSGI:是否可以在不激活 bundle 的情况下导入包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11537817/