簡體   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