【发布时间】:2011-08-18 06:05:12
【问题描述】:
我有一个 OSGi 包,它也可以在纯 Java 进程中运行。我需要能够判断捆绑包是否已加载到 OSGi 系统中。我怎样才能做到这一点?如果没有 OSGi 标准的方法来做这件事,我将满足于 Eclipse/Equinox 特定的方法。
【问题讨论】:
我有一个 OSGi 包,它也可以在纯 Java 进程中运行。我需要能够判断捆绑包是否已加载到 OSGi 系统中。我怎样才能做到这一点?如果没有 OSGi 标准的方法来做这件事,我将满足于 Eclipse/Equinox 特定的方法。
【问题讨论】:
将 Bundle-Activator 添加到您的 MANIFEST.MF。如果它被实例化,那么您的 JAR 将在 OSGi 容器中运行。
【讨论】:
如果您没有激活器,也可以尝试询问您的捆绑包:
Bundle b = org.osgi.framework.FrameworkUtil.getBundle(MyClass.this);
如果它返回 null,那么 OSGi 没有加载你的类。
【讨论】:
您可以检查“this.getClass().getClassLoader() instanceof org.osgi.framework.BundleReference”是否为 true,如果您在 R4.2 OSGi 框架中运行,则应该是这样。
【讨论】:
对 Richard S. Hall 的改进答案,它不需要 osgi 的编译和运行时依赖项。它还会检查一个类的类加载器是否实现了org.osgi.framework.BundleReference 接口。
Class<?> classToCheck = this.getClass().getClassLoader().getClass();
boolean runningOsgi = isOsgiClassLoader(classToCheck);
...
boolean isOsgiClassLoader(Class<?> classLoaderClass) {
Class<?> c = classLoaderClass;
while (c != null) {
if (c.getName().equals("org.osgi.framework.BundleReference")) {
return true;
}
for (Class<?> ifc : c.getInterfaces()) {
if (isOsgiClassLoader(ifc)) {
return true;
}
}
c = c.getSuperclass();
}
return false;
}
【讨论】: