问题标签 [osgi-fragment]

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 投票
1 回答
495 浏览

osgi - PackageAdmin.getFragments 的替代方法是什么

据我所知,使用 OSGi 4.3PackageAdmin已被弃用。然后,您如何找到特定捆绑包的片段 - 即替代方案是PackageAdmin.getFragments(Bundle bundle)什么?

0 投票
2 回答
3137 浏览

java - Tycho 无法解决片段对其他片段的依赖

我想为org.eclipse.swt片段创建一个扩展。我创建了一个swt.extension包含以下 MANIFEST.MF 的包:

另外,我创建了一个从 SWT 扩展接口的接口:

当我使用 tycho ( mvn clean install) 构建项目时,会出现以下错误:

tycho 似乎只解析 org.eclipse.swt jar。这是一个主机包,它不包含任何类。实际实现在 org.eclipse.swt.win32.win32.x86_64 片段包中。当 tycho-compiler-plugin 编译项目时,看起来这个包不在类路径上。

这是第谷的错误吗?他们有任何解决方法吗?

我已将所有来源放在 GitHub 上:https ://github.com/orionll/tycho-fragment-to-fragment-dependency

我使用 Maven 3.1.0

0 投票
2 回答
906 浏览

osgi - OSGI Pax 日志记录

我想编写一个自定义附加程序,它将收集 Fuse 容器中 Fuse.log 的所有日志,并将它们通过 Scribe 中继到中央日志存储。我想在容器中为此添加一个事件侦听器。但我不知道我该怎么做。我浏览了 PAX 日志记录代码。但是想不通。任何建议都非常感谢。

0 投票
1 回答
612 浏览

java - 如何使用 OSGi 片段包注册自定义 Logback 过滤器?

我有一个名为foo.bar.MatcherFilter.

我在 logback.xml 中声明了它,

起初,当MatcherFilter捆绑在我的应用程序包中时,Logback 会报告ClassNotFoundException.

所以我捆绑foo.bar.MatcherFilter成一个片段包,

我还是一样ClassNotFoundException

我知道片段将共享主机包中的类加载器。因此,Logback 应该能够实例化MatcherFilter. 如果我弄错了,请纠正我。

使用 OSGi 片段包注册自定义过滤器,可以这样做吗?

0 投票
1 回答
659 浏览

osgi - 从 OSGi 片段包访问服务

在我的项目中,有一个 OSGi 包将接口公开com.xyx.EventProvider为 declerative 服务。

还有另一个 3rd 方包org.eclipse.equinox.http.jetty,我附上了一个片段包com.xyz.jetty.customizer

这个片段包需要访问通过接口暴露的服务com.xyx.EventProvider

问题是片段包没有激活器,因此它没有对 BundleContext 的引用,因此它无法访问任何服务。

OSGi 中有没有办法实现这一点?

0 投票
1 回答
259 浏览

maven - 有没有办法优先考虑片段依赖关系?

有没有办法优先考虑片段依赖关系?我的情况是,在编译时使用的 Maven 插件之一不使用分层 OSGi 类加载,而是使用“平面”类路径。现在主机插件的(传递)依赖项和片段之间存在版本冲突。在分层场景中一切都可以正常工作,但对于“平面”类路径则失败。

有没有办法优先考虑片段依赖关系?从逻辑上讲,我的意思是片段的依赖关系应该在主机的依赖关系之前解决。

0 投票
3 回答
2488 浏览

osgi - Replacing classes/resources with an OSGi fragment - possible without including a jar in the fragment?

We want to replace certain resources in a host OSGi bundle by adding an OSGi fragment.

As I understand it, the resources included in an OSGi fragment are merely added to the classpath of the host bundle. There is no guarantee that if the fragment is adding a resource that already exists in the host bundle, the resource from the fragment will be loaded: it could also still be the host version.

In order to make sure the fragment version of the resource is loaded instead of the host version, http://wiki.osgi.org/wiki/Fragment mentions it is possible to use the Bundle-ClassPath header to specify resources as "first"(preferred).

It gives patch.jar as an example:

As mentioned there: "Since patch.jar is ahead of '.' it will allow classes to be preferentially loaded from the fragment instead of the host."

I could use this technique, but this means I first have to bundle my fragment resources in a separate jar and then include this jar in the fragment bundle.

Is there a way to preferentially load classes/resources from the fragment instead of the host without having to include a jar in the fragment?

0 投票
1 回答
736 浏览

osgi - 由于 ServiceRegistry 阻塞线程

我有一个相对高容量/请求系统,我们在其中使用 OSGi。我们每天收到近 8 亿个请求。

我们目前看到一些线程被阻塞的问题。对于传入的每个请求,我们使用 registerService 将事件/数据转发到 osgi 包,以将有效负载/数据传递给正在侦听此服务的 OSGi 包。

像这样: bundleContext.registerService(Map.class.getName(), dataHolderMap, null);

dataHolderMap 只不过是一个常规的 java hashmap

这是使用 JStack 的线程转储:

==================================================== ==========================

“RequestThread”prio=10 tid=0x00000000421ab800 nid=0x1042 可运行 [0x00007fbdd3867000] java.lang.Thread.State:在 org.apache.felix.framework.ServiceRegistry.getService 可运行(ServiceRegistry.java:295) - 锁定 <0x0000000700e2c590>( org.apache.felix.framework.ServiceRegistry) 在 org.apache.felix.framework.Felix.getService(Felix.java:3568) 在 org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:468) 在org.osgi.util.tracker.ServiceTracker.addingService(ServiceTracker.java:411) 在 org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:932) 在 org.osgi.util.tracker.ServiceTracker$ org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java: 中的 Tracked.customizerAdding(ServiceTracker.java:864)256) 在 org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) 在 org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:894) 在 org.apache.felix.framework .util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:932) 在 org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793) 在 org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher .java:543) 在 org.apache.felix.framework.Felix.registerService(Felix.java:3423) 在 org.apache.felix.Felix.fireServiceEvent(Felix.java:4419)。 framework.BundleContextImpl.registerService(BundleContextImpl.java:346) 在 org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320) 在 com.mypackage.person.bs.processor.Processor.sendEvent(Processor.java:56) 在 com.mypackage.jetMyStream.event.support.AbstractEventSource.fireSendEvent(AbstractEventSource.java:97) 在 com.mypackage.jetMyStream .event.channel.messaging.InboundMessagingChannel.fireEvent(InboundMessagingChannel.java:113) 在 com.mypackage.jetMyStream.event.channel.messaging.InboundMessagingChannel.onMessage(InboundMessagingChannel.java:204) 在 com.mypackage.jetMyStream.messaging.MessageService .dispatchMessageForContext(MessageService.java:349) 在 com.mypackage.jetMyStream.messaging.MessageService.dispatch(MessageService.java:259) 在 com.mypackage.jetMyStream.messaging.MessageServiceRequest.execute(MessageServiceRequest.java:40) 在 com。 mypackage.jetMyStream.util.RequestThread.run(RequestThread.java:69)

“RequestThread”prio=10 tid=0x00000000425f8800 nid=0x1041 等待监视器条目 [0x00007fbdd3968000] java.lang.Thread.State: 在 org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java: 109) - 等待在 org.apache.felix.framework.Felix.registerService(Felix.java:3393) 在 org.apache.felix.framework.BundleContextImpl 处锁定 <0x0000000700e2c590> (一个 org.apache.felix.framework.ServiceRegistry) .registerService(BundleContextImpl.java:346) 在 org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320) 在 com.mypackage.person.bs.processor.Processor.sendEvent(BullseyeModelProcessor.java:56) 在com.mypackage.jetMyStream.event.support.AbstractEventSource.fireSendEvent(AbstractEventSource.java:97) 在 com.mypackage.jetMyStream.event.channel.messaging.InboundMessagingChannel.fireEvent(InboundMessagingChannel.java:113) 在 com.mypackage.jetMyStream.event.channel.messaging.InboundMessagingChannel.onMessage(InboundMessagingChannel.java:204) 在 com .mypackage.jetMyStream.messaging.MessageService.dispatchMessageForContext(MessageService.java:349) 在 com.mypackage.jetMyStream.messaging.MessageService.dispatch(MessageService.java:259) 在 com.mypackage.jetMyStream.messaging.MessageServiceRequest.execute(MessageServiceRequest .java:40)jetMyStream.messaging.MessageService.dispatchMessageForContext(MessageService.java:349) 在 com.mypackage.jetMyStream.messaging.MessageService.dispatch(MessageService.java:259) 在 com.mypackage.jetMyStream.messaging.MessageServiceRequest.execute(MessageServiceRequest.java: 40)jetMyStream.messaging.MessageService.dispatchMessageForContext(MessageService.java:349) 在 com.mypackage.jetMyStream.messaging.MessageService.dispatch(MessageService.java:259) 在 com.mypackage.jetMyStream.messaging.MessageServiceRequest.execute(MessageServiceRequest.java: 40)

在 com.mypackage.jetMyStream.util.RequestThread.run(RequestThread.java:69)

关于这个的几个问题:

  1. 我在通过 registerService 发送地图时做错了什么吗?如果是这样,我的选择是什么?

  2. 关于如何让它发挥作用的任何想法?我们有 26 个节点,使用这种机制每秒只需要处理大约 400 个请求

    有人有类似的问题吗?任何指针都非常感谢

谢谢马斯蒂

0 投票
0 回答
1032 浏览

osgi - 当存在两个片段时,主机包无法在 Karaf 重新启动时启动

我正在使用 Karaf 3.0.1 并且有两个片段包 A 和 B 附加到主机包 C。我能够安装 A,然后是 B,然后是 C,然后启动 C,一切正常。

但是,当我停止并启动 Karaf 时,主机通常会出现故障并且无法成功启动。两个片段都被列为“已解决”并显示为已附加到主机,并且主机显示它已附加到片段,但主机的状态为“失败”。日志文件中的异常是:

如果我只部署一个片段,那么我可以重新启动 Karaf 并且主机可以正常启动。但是有两个片段,Karaf 可能会重新启动一次或两次,但随后会失败并且永远不会再次成功启动。我玩的是开始级别,让主机有更高/更晚的开始级别根本没有帮助。

我阅读了 OSGi 片段何时附加到主机?这似乎清楚地表明开始级别不会影响解决顺序,并且看到了使用提供/要求能力标头的建议。我试过了,看到了同样的行为,尽管再次使用单个片段它工作正常。

我还能做些什么来让它发挥作用?Karaf/Felix 中是否存在关于重启时同一主机的多个片段的错误?

是的,我宁愿不使用片段,而是将一个相当复杂的 Java EE 应用程序移植到 OSGi,鉴于我拥有的代码库,这是可行的方法,但如果我不能依赖于 Karaf 启动时正确启动的事情,这是行不通的。

谢谢,

凯文

0 投票
1 回答
1998 浏览

java - Osgi eclipse:如何从片段包中导出包并使它们对外部包可见?

启动情况(没有任何错误):

  • 我有三个不同的捆绑包:捆绑包 A(称为 org.apache.xmlbeans)、捆绑包 B 和捆绑包 C
  • 捆绑 B 导入从捆绑 A 导出的一些包
  • bundle B 导出一些包(例如包 com.prova.xsd.config)
  • 包 C 导入包 B 导出的包(例如包 com.prova.xsd.config)

现在我将bundle B作为bundle A(fragment-host)的一个片段,在bundle B的MANIFEST中添加指令Fragment-Host: org.apache.xmlbeans

在此更改之后,所有捆绑包(A、B、C)的 MANIFEST.MF 中没有错误,但在捆绑包 CI 的类 .java 中存在编译错误:“无法导入 com.prova.xsd.config已解决”与文件 .java 开头的导入相关联。

问题是什么?我该如何解决?

非常感谢,

安德烈亚