【问题标题】:Passing arguments between parent application and OSGi Framework在父应用程序和 OSGi 框架之间传递参数
【发布时间】:2013-10-02 11:43:40
【问题描述】:

我必须在父应用程序和嵌入式 OSGi 之间传递参数。我在 Launcher 类中使用 Equinox 并通过 FrameworkFactory 运行 OSGi,然后安装并启动捆绑包。是否可以将对象引用甚至某些原始类型传递给捆绑或服务?

【问题讨论】:

    标签: java frameworks arguments osgi equinox


    【解决方案1】:

    启动框架后,您可以获取系统bundle上下文,并在框架中访问和调用bundle注册的服务。必须注意服务类型,因为它们可能是从包中加载的,因此这些类型对您的启动代码不直接可见。但是你可以使用反射。或者,您可以将这些类型放入框架类加载器中,并通过启动器设置的org.osgi.framework.system.packages.extra 框架属性从系统包中导出它们。

    【讨论】:

    • 感谢您的回答,但这不是我的问题的解决方案。我想从我的父应用程序类(它将是 OSGi 框架的启动器)中运行具有特定参数(例如对象引用)的包或服务。您正在谈论通过 system_packages_extra 将整个类发送到系统包以在 OSGi 框架中对其进行可见性 - 我不需要它(我通过将我需要的类添加到 osgi 类路径作为包来解决它)。
    • 我可以使用反射从带有参数的启动器类运行服务方法吗?但是如何在 OSGi 框架之外获取服务类名称?
    • 您可以使用反射在启动器中对您不可见的类型的服务调用方法。您可以传递可以直接或通过反射创建的任何参数类型。
    • 你能举个例子吗?我不知道如何通过反射 Class> c = Class.forName("BundleService"); 获取服务类名称来创建它我试过这个:Bundle[] bundles = ctx.getBundles(); for (Bundle bun: bundles){ System.out.println(bun.getClass());但它不起作用......我只有 org.eclipse.osgi.framework.internal.core.BundleHost 类
    • 您无需加载类即可使用该服务。使用接受类名字符串的服务 API。例如osgi.org/javadoc/r5/core/org/osgi/framework/…。然后获取服务对象:osgi.org/javadoc/r5/core/org/osgi/framework/…。然后使用反射来调用对象上的方法,因为您无法看到服务类型。
    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 2010-09-09
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多