Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检测是否在osgi容器中运行_Java_Eclipse_Osgi - Fatal编程技术网

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

Java 如何检测是否在osgi容器中运行,java,eclipse,osgi,Java,Eclipse,Osgi,我有一个OSGi包,它也可以在普通Java进程中运行。我需要能够判断捆绑包是否加载在OSGi系统中。我该怎么做?如果没有OSGi标准的方法,我会选择Eclipse/Equinox特定的方法。将Bundle Activator添加到MANIFEST.MF。如果它被实例化,那么您的JAR将在OSGi容器中运行。您可以检查“this.getClass().getClassLoader()instanceof org.OSGi.framework.BundleReference”,只有在R4.2 OSG

我有一个OSGi包,它也可以在普通Java进程中运行。我需要能够判断捆绑包是否加载在OSGi系统中。我该怎么做?如果没有OSGi标准的方法,我会选择Eclipse/Equinox特定的方法。

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

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

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

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

如果返回null,则表明您的类没有被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;
}
Class classToCheck=this.getClass().getClassLoader().getClass();
布尔runningOsgi=isOsgiClassLoader(classToCheck);
...
布尔isOsgiClassLoader(类classLoaderClass){
c类=类装载机类;
while(c!=null){
if(c.getName().equals(“org.osgi.framework.BundleReference”)){
返回true;
}
对于(ifc类:c.getInterfaces()){
if(isOsgiClassLoader(ifc)){
返回true;
}
}
c=c.getSuperclass();
}
返回false;
}

这与“getClass().getClassLoader()instanceof org.osgi.framework.BundleReference”方法相比如何?这是否适用于范围更广的OSGi版本?看看实现,它也取决于BundleReference,可以从OSGi4.2 on(Eclipse3.5.x?)获得。我建议使用instanceof检查,因为它是API。请注意,“instanceof”检查也是API,因为规范规定捆绑包的类加载器必须实现BundleReference。如果此代码在非osgi运行时运行,这不会引发类未找到异常吗?这里有很多投票。有人能向新手解释一下原因吗?这是一个简单可行的解决方案。在OSGi4.2之前,没有一种方便的方法来内省类装入器以确定其作为捆绑包的状态(PackageAdmin.getBundle是唯一的方法)。谢谢。这个附加注释是我想我需要的(可操作的)细节。好吧,要访问PackageAdmin,你必须为getService获得BundleContext,所以你需要一个BundleActivator。如果您在其他JAR中已经有一个Bundle Activator,那么是的,您可以使用PackageAdmin.getBundle检查任意类。Bundle Activator需要实现在非osgi环境中不存在的org.osgi.framework.BundleActivator。我在eclipse设置中使用测试,并将org.eclipse.osgi作为类加载器包的开始。我决定检查在非osgi情况下类加载器的名称是什么(com.sun…,我忘了,现在我在家了)。这使得我的测试可以在其他osgi实现中工作,尽管它取决于其他非osgi类加载器实现的使用,并在工作中使用扳手。