当前位置: 首页 > 知识库问答 >
问题:

嵌入式osgi框架,如何调用服务功能?

司马彬
2023-03-14

我有一个简单的java项目,叫做服务器。此外,我有一个osgi api项目,它定义了一个接口BlockProvider。接下来,我有一个osgi声明性服务项目,其中有一个实现BlockProvider的服务。

在我的java项目服务器中,我有一个嵌入式osgi框架(在我的例子中是felix)。

我创建了一个bundleactivator,它安装gogo osgi捆绑包、scr捆绑包、我的api项目捆绑包和服务项目捆绑包。

工作没有问题,我可以检查我的服务包。

在我的服务器项目中,我想看看哪些服务实现了BlockProvider接口。所以我实现了一个ServiceTracker与BlockProvider.class.get名称()作为第二个参数(过滤器之一)。

getServices()返回我的服务项目也可以正常工作。

但问题来了:我不能调用接口BlockProvider上的任何函数,因为“服务器”项目中的BlockProvider使用不同的类加载器(sun.misc.Launcher)$AppClassLoader@4e0e2f2a)而不是服务项目(o:yellowblock[6])。

我怀疑我在这里忽略了一些基本的东西:但是我如何调用我的区块提供商服务的函数来实现我的区块提供商接口?

共有2个答案

万俟玉书
2023-03-14

这里有两条重要的规则。

>

  • 当两个捆绑包通过服务进行通信时,它们必须都从同一捆绑包导入API包。通常,您可以选择实际导出包的捆绑包。服务提供者可以将其导出,在这种情况下,使用者必须从提供者导入。或者,您可以有一个单独的“纯API”捆绑包来导出API包,提供者和使用者都可以从那里导入它。(消费者捆绑包很少导出包,这在OSGi中是合法的,但设计有点怪异。)

    系统捆绑包——即从OSGi内部表示OSGi框架本身的特殊捆绑包——不能从任何普通捆绑包导入包。它只能出口。

    当您嵌入OSGi时,您在OSGi之外的应用程序代码被视为系统捆绑包的一部分。如果您希望系统捆绑包通过服务与另一个捆绑包通信,那么结合上面的两个规则意味着应用编程接口包必须由系统捆绑包导出。无论系统捆绑包是服务的提供者还是消费者,这都是正确的。

    因此,API包必须包含在嵌入应用程序的系统类路径中,并在使用org设置OSGi框架时从系统包中导出。奥斯基。框架系统包装。额外的属性。

  • 韦昊焜
    2023-03-14

    如果API包由系统包/框架提供,则只能从OSGi框架外部访问服务。因此,您不应该安装API包,而应该使用框架属性org。奥斯基。框架系统包装。导出API包的额外步骤。

     类似资料:
    • 问题内容: 我已经嵌入了Felix。我有一些API捆绑包和Impl。API导出接口。Impl导入该接口并在激活器中注册impl。现在我要获取C隐含的OSGi 现在,我想与它进行交互。我可以反思 但是我不能投 我猜这来自不同的ClassLoader。但是我该如何解决呢?我们如何从外部与OSGi上下文进行交互?或者我们可以将其全部放入OSGi容器中? 问题答案: 如果要嵌入OSGi,则该服务的API(

    • 我们正在使用ApacheFelix(版本4.4.1)作为嵌入式OSGi框架。提供该框架的主要应用程序使用作为日志框架。存在对log4japi和log4jcore的依赖。当然,当主应用程序启动时,也会加载和配置Log4j2。主部件中触发的所有日志消息都正确写入已配置的Appender。 现在是重点。加载的所有bundle都应该能够使用与主应用程序相同的配置和日志上下文。我试图做的是提供所有Log4j

    • 在一个PC游戏中,我有ingame浏览器用于新闻、虚拟货币商店和社交网络。它是由Chromium嵌入式框架的全新更新构建的。问题是当我打开一个浏览器窗口(网站在那里工作良好),然后关闭,对于某些网站CEF子进程没有完成。我也可能继续听音频,如果是Youtube视频,例如。我使用的是屏幕外呈现,其他原生窗口不创建,只创建子进程。要关闭浏览器窗口,我删除对CefBrowser的所有引用并调用: 我还尝

    • 示例:如何打包visual studio aws无服务器项目? 使用命令行和无服务器,需要做什么才能正确地将dotnet核心功能部署到AWS Lambda?这可能使用无服务器框架吗?

    • 问题内容: 我想制作一个桌面应用程序来浏览一个网站,我不想制作一个浏览器,而是一个浏览器嵌入的应用程序。我尝试过,但是发现了一些问题,例如缺少对插件的支持(例如:Flash,pdf查看器等)。 经过大量搜索后,我发现了Chromium嵌入式框架(CEF)或JCEF Java包装器,但我不知道如何在Java中使用它。 是否可以在Java应用程序中嵌入CEF / JCEF? 问题答案: 是否可以在Ja

    • 我正在开发一个cron,我正在使用一个web客户端向一个rest API发送一个post请求。我不想让嵌入式服务器保持开机状态,因为cron需要在几秒钟内完成其任务。但当我不使用服务器时: 更新:我试过了 但是获取由:java.lang.IllegalStateException:org.springframework.boot.web.reactive.context.AnnotationCon