如何检测是否在osgi容器中运行

时间:2011-05-04 05:35:40

标签: java eclipse osgi

我有一个OSGi包,也可以在纯Java进程中运行。我需要能够判断捆绑包是否已加载到OSGi系统中。我怎样才能做到这一点?如果没有OSGi标准的方法,我将采用Eclipse / Equinox特定的方法。

4 个答案:

答案 0 :(得分:10)

将Bundle-Activator添加到您的MANIFEST.MF。如果它被实例化,那么你的JAR就在OSGi容器中运行。

答案 1 :(得分:6)

如果您没有激活器,您也可以尝试询问您的捆绑包:

Bundle b = org.osgi.framework.FrameworkUtil.getBundle(MyClass.this);

如果它返回null,则OSGi不会加载您的类。

答案 2 :(得分:1)

您可以检查“this.getClass()。getClassLoader()instanceof org.osgi.framework.BundleReference”,只有在R4.2 OSGi框架中运行时才应该为真。

答案 3 :(得分:0)

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;
}