繁体   English   中英

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

[英]how to detect if running in osgi container

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

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

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

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

如果它返回 null,则 OSGi 未加载您的 class。

您可以检查“this.getClass().getClassLoader() instanceof org.osgi.framework.BundleReference”是否为 true,如果您在 R4.2 OSGi 框架中运行,则该选项应为 true。

对 Richard S. Hall 的改进答案,它不需要 osgi 的编译和运行时依赖项。 它还检查 class 的类加载器是否实现了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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM