问题标签 [declarative-services]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1345 浏览

maven - 使用库中的注释,该库不是 Tycho 构建中的捆绑包

我正在使用 Tycho 构建一个 Eclipse 插件,并为我的 OSGi 服务使用声明式服务。Eclipse 有一个不错的 DS 文件编辑器,但它仍然是一个手动过程,这意味着它速度慢且容易出错。

在非 Tycho OSGi 项目中,我可以使用maven-scr-plugin来生成这些注释。Tycho 的问题是我不能添加对org.apache.felix.annotationsjar 的引用,因为它是

  • 不存在于 p2 存储库中
  • 不是捆绑

这些注释是用 a 定义的RetentionPolicy = CLASS,所以它们不必在一个包中。

我知道对 pom-first artifacts 的依赖,但它对我不起作用,因为注释 jar 不是一个包。理想情况下,我可以配置 Tycho/Eclipse 以在编译时查找额外的 jar。

如何获得 Tycho 和 Eclipse 考虑的仅编译时 jar?


更新:我尝试extraClasspathElements使用tycho-compiler-plugin. 这确实允许我调用maven-scr-plugin(请参阅当前的 pom.xml)。但是,似乎 scr 插件无法访问这些类,因为构建失败了

[错误] 无法在项目 org.apache.sling.ide.eclipse-core: /mnt/md/ 上执行目标 org.apache.felix:maven-scr-plugin:1.13.0:scr (generate-scr-descriptor) robert/git/sling-ide-tools/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServerUtil.java:无法加载编译类:org.apache.sling.ide.eclipse.core。服务器实用程序

您还可以查看完整的构建日志

0 投票
1 回答
792 浏览

java - OSGi“更新”命令;动态服务不会重启

我正在开发一个基于 OSGi 的系统,我打算定期“更新”而不关闭整个系统。我打算使用“更新”来促进捆绑更改,因此编写了一个小应用程序(2 个捆绑包)来尝试证明该理论。

我的最终目标:我正在尝试实现一个可以使用 OSGi 动态更新捆绑包的平台。

到目前为止:我已经制作了 2 个捆绑包;一个数学包(有 2 个可以相加和相乘的方法)和一个显示包,它有一个每秒运行的线程,生成 2 个随机数并使用前面提到的数学包对它们进行相加和相乘(并显示结果)。我正在使用声明性服务,因此在数学包中有一个组件定义,它导出由接口 IMath 定义的服务。同样,我在显示包中有一个组件定义,它订阅(1:1 静态)由 IMath 接口定义的服务。我在每个组件的启动/关闭的每个阶段都有典型的调试消息。

当项目启动时,我通常会看到:

然后每一秒我都会看到显示线程进行计算。此外,我可以执行以下操作(假设数学是捆绑 1,显示是捆绑 2)。

问题:到目前为止一切都很好,对吧?在我尝试使用“更新”命令之前,一切都很好。在这种情况下,我想更新数学包,因为我在乘法计算中出错了。

什么?为什么 ds 没有调用我的启动方法来重新启动显示包?我还尝试更新显示包,它似乎工作正常。我的感觉是,如果您更新捆绑包,它将重新启动,但是从更新的捆绑包订阅服务的任何捆绑包都将处于不确定状态。

更糟糕的是,如果我停止并启动显示包,它仍然无法启动!

我相当确定我正在以错误的方式看待某些事情,所以如果有人能对我的问题有所了解,那就太好了。如果有人想要源代码,请告诉我,我可以附上一些基本的 java 文件来演示问题。

如果我对我的问题不够具体,请告诉我,我会推断。

谢谢阅读!亚伦

0 投票
1 回答
1051 浏览

console - 在 OSGi 控制台上打印消息

我正在实现一个非常轻量级(嵌入式)的 OSGi 框架,它在目标硬件上运行。要附加控制台,我使用的是 org.apache.felix.gogo.shell 和 org.apache.felix.shell.remote。

迄今为止,我已经使用 System.out.println 记录了所有自定义消息,它运行良好,但现在我正在使用远程控制台,我需要一些允许我将消息“打印”到 OSGi 控制台(和希望出现在目标的控制台以及由 felix.shell.remote 提供的 telnet 控制台上)。

我猜必须有一种方法可以获取 OutputStream (或类似的)的句柄来执行此操作;我的问题是如何?似乎大多数人重定向他们的标准输出等来解决这样的问题。

我正在使用声明式服务,所以我希望能够设置一个附加引用服务的组件(不重要,但会使它变得漂亮和整洁)。

任何帮助是极大的赞赏。

0 投票
1 回答
414 浏览

osgi - ServiceTracker 和 DS 相结合?

让我们想象一个存在于其中的捆绑包:

  • 一个组件负责监听服务注册表中的所有“设备”服务实例。

  • 相同的组件需要一个“适配器工厂”才能通过使用发现的设备创建“适配器”。

  • 该工厂由另一个捆绑包拥有。

我可以通过使用 ServiceTracker(Activator + Service Tracker)解决部分问题:激活器实例化 ServiceTracker,它可以注册“设备”服务中的所有更改。

但是我无法将在其他包中创建的 DS 工厂注入到此服务跟踪器,因为它会导致两个实例(一个由激活器创建且没有成员 /// 另一个由 osgi 创建且具有成员变量 ok 但不能监听“设备”服务的变化)。

那么...我该如何解决这种情况?作为班级成员,我怎样才能拥有一个服务跟踪器(对我来说是完美的)?

0 投票
2 回答
925 浏览

java - 控制 osgi 声明式服务的实例化

我正在寻找一种简单的方法来控制声明性服务的实例化。

我想要的是一个类似于工厂的东西,它被要求返回一个组件的实例,但我可以在其中控制实例化。

目前,我刚刚找到了可以使用给定字典调用 newInstance 的 ComponentFactory。但我真正想要的是这样的,假设 IComponent 是声明式服务接口,而 MyComponent 是实现类

声明式服务是否有可能发生这样的事情,还是我需要在捆绑激活码中使用我自己的服务注册?

提前致谢

0 投票
1 回答
301 浏览

osgi - Osgi Equinox 从外部包启用组件

鉴于这种情况:

Bundle A:组件 1A(启用:false) Bundle B:组件 2B

如何从 Bundle B 或 Component 2B 启用组件 1A?

我试图通过使用componentContext来做到这一点,

但它似乎只适用于同一个包中的服务。

0 投票
1 回答
55 浏览

jar - 加载位于 bundle jar 之外的组件定义

我需要从 jar(包)外部加载组件定义(xml 文件)。

我试图把它放在:

  • 插件/my.bundle.name/OSGI-INF/mycomponent.xml
  • 插件/OSGI-INF/mycomponent.xml

而且我也玩过bundle的类路径,但没有运气。

0 投票
1 回答
1684 浏览

servlets - OSGi 声明式服务注入

我正在尝试在本地 Glassfish 服务器上使用声明式服务来做一个简单的 OSGi 服务。提供的插件始终处于活动状态。

我在注入使用我的服务的 servlet 时遇到了麻烦,调用 servlet 时引用为空,因为它与注入服务引用的对象不同。

我通过在我的引用设置器中放置一个断点来测试它,我看到我的服务被注入了,但是当我单击将我的 servlet 调用到我的应用程序中的按钮时,服务引用为空,因为它不是同一个对象(即获取注入 servlet_Instance #1 但调用 servlet_Instance #2 上的方法。我一定遗漏了一点细节,因为我可以在做的时候找到并使用我的服务

用于生成我的 XMLs 文件的插件:maven-scr-plugin

这是我的服务班

生成的 XML 是

我的小服务程序是

生成的 XML

我也尝试过,但没有运气,因为似乎没有找到我的 servlet(错误 404 - 请求的资源()不可用。),正如 Peter Kriens 在那里写的那样:如何使用 OSGi HTTP 服务中的 OSGi 服务

所以我像这样修改了我的servlet:

生成的 XML 是

我从我的 JSP 访问 servlet

为了测试上述内容,我在我部署的包 org.apache.felix.http.api-2.2.1、org.apache.felix.http.whiteboard-2.2.1 中进行了测试,就像在帖子中一样。没查到有没有开关。

我还检查了 org.apache.felix.webconsole-4.2.0-所有捆绑包,服务已经启动并运行,它说我的消费者捆绑包正在使用它。

0 投票
1 回答
314 浏览

netbeans - 如何将声明式服务支持添加到 Netbeans 中的嵌入式 felix?

在netbeans中,嵌入式felix不支持DS。如何将Felix服务组件运行时添加到netbeans中的嵌入式felix。

0 投票
2 回答
187 浏览

osgi - 何时在 OSGi 中关闭 HttpClient 的 ConnectionManager

我有一个 OSGi 包,它通过 DS、A 和 B 使用两个服务。

B 服务在内部使用 Apache 的 HttpClient。

我的问题是,我什么时候应该关闭 HttpClient 的 ConnectionManager,我尝试在服务 B 的“unbind”方法中执行它,但它不起作用,因为调用 unbind 方法并不意味着实例被销毁所以同一个实例可以重新绑定,因此我的以下请求将失败,因为 ConnectionManager 已关闭。

希望有人可以对 OSGi 环境中的 HttpClient 使用有所了解。