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

发布于 2024-11-04 19:07:00 字数 121 浏览 0 评论 0原文

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

I have an OSGi bundle that can also run in plain Java process. I need to be able to tell if the bundle was loaded in an OSGi system or not. How can I do that? If there is no OSGi-standard way of doing this, I will settle for Eclipse/Equinox-specific approach.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

回忆那么伤 2024-11-11 19:07:01

如果您没有激活器,您也可以尝试请求您的包:

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

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

If you don't have an activator, you can also try asking for your bundle:

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

If it returns null, your class wasn't loaded by OSGi.

木有鱼丸 2024-11-11 19:07:01

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

You can check whether "this.getClass().getClassLoader() instanceof org.osgi.framework.BundleReference", which should only be true if you are running in an R4.2 OSGi framework.

救星 2024-11-11 19:07:01

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

An improved answer to Richard S. Hall that doesn't require a compile and runtime dependency to osgi. It also checks if the classloader of a class implements org.osgi.framework.BundleReference interface.

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;
}
上课铃就是安魂曲 2024-11-11 19:07:00

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

Add Bundle-Activator to your MANIFEST.MF. If it gets instantiated, then your JAR is running in an OSGi container.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文