没有 Bundle-Activator OSGi bundle 如何启动

How does OSGi bundle get started without Bundle-Activator

如果 MANIFEST-MF 文件中没有 Bundle-Activator,OSGi 包如何激活?例如,Google 番石榴可以 运行 作为一个包并在 Karaf 容器中激活,但 MANIFEST-MF 文件不包含 Bundle-Activator 属性.

Manifest-Version: 1.0
Bnd-LastModified: 1408992499326
Build-Jdk: 1.7.0-google-v6
Built-By: cgdecker
Bundle-Description: Guava is a suite of core and expanded libraries that
  include    utility classes, google's collections, io classes, and much
     much more.    Guava has only one code dependency - javax.annotation
 ,    per the JSR-305 spec.
Bundle-DocURL: https://guava-libraries.googlecode.com/
Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-ManifestVersion: 2
Bundle-Name: Guava: Google Core Libraries for Java
Bundle-SymbolicName: com.google.guava
Bundle-Version: 18.0.0
Created-By: Apache Maven Bundle Plugin
Export-Package: com.google.common.net;uses:="javax.annotation,com.google
 .common.base,com.google.common.hash,com.google.common.io,com.google.com
 mon.primitives,com.google.common.collect,com.google.common.escape";vers
 ion="18.0.0",com.google.common.html;uses:="com.google.common.escape,jav
 ax.annotation";version="18.0.0",com.google.common.collect;uses:="com.go
 ogle.common.base,javax.annotation,com.google.common.primitives,com.goog
 le.common.math";version="18.0.0",com.google.common.primitives;uses:="co
 m.google.common.base,javax.annotation,sun.misc";version="18.0.0",com.go
 ogle.common.base;uses:="javax.annotation";version="18.0.0",com.google.c
 ommon.escape;uses:="com.google.common.base,javax.annotation";version="1
 8.0.0",com.google.common.cache;uses:="com.google.common.collect,com.goo
 gle.common.util.concurrent,javax.annotation,com.google.common.base,com.
 google.common.primitives,sun.misc";version="18.0.0",com.google.common.e
 ventbus;uses:="com.google.common.collect,com.google.common.cache,javax.
 annotation,com.google.common.base,com.google.common.util.concurrent,com
 .google.common.reflect";version="18.0.0",com.google.common.util.concurr
 ent;uses:="com.google.common.base,javax.annotation,com.google.common.co
 llect,com.google.common.primitives,com.google.common.math";version="18.
 0.0",com.google.common.hash;uses:="com.google.common.primitives,com.goo
 gle.common.base,javax.annotation,com.google.common.math";version="18.0.
 0",com.google.common.io;uses:="javax.annotation,com.google.common.base,
 com.google.common.math,com.google.common.hash,com.google.common.collect
 ,com.google.common.primitives";version="18.0.0",com.google.common.xml;u
 ses:="com.google.common.escape,javax.annotation";version="18.0.0",com.g
 oogle.common.reflect;uses:="javax.annotation,com.google.common.base,com
 .google.common.collect,com.google.common.primitives";version="18.0.0",c
 om.google.common.math;uses:="com.google.common.base,com.google.common.p
 rimitives,javax.annotation";version="18.0.0",com.google.common.annotati
 ons;version="18.0.0"
Import-Package: javax.annotation;resolution:=optional,sun.misc;resolutio
 n:=optional
Tool: Bnd-1.50.0

首先,还有其他方法可以启动捆绑包中的逻辑,例如它可以是蓝图或声明式服务。但我怀疑番石榴确实有那个, 所以你在这里看到的是一个典型案例。 OSGi 包通常遵循以下步骤:

a) 安装
b) 已解决
c) 开始
d) 活跃
e) 停止
f) 已卸载

这适用于所有包,只有片段会保持已解析状态,因为片段包本身不能 started/activated。

如果您的包(或本例中的 guava)没有明确的 Activator class 将在活动阶段调用,包仍然可以活动。