gpt4 book ai didi

java - 对 Karaf 的服务状态不满意(引用) - 错误在哪里? (OSGi、声明式服务、注释)

转载 作者:行者123 更新时间:2023-12-01 09:22:51 25 4
gpt4 key购买 nike

我有一个非常简单的服务提供者和消费者。由于某种原因,我无法解决我的消费者使用提供商服务的问题。以下是提供者的捆绑源代码:

package test;

import org.osgi.framework.BundleContext;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;

@Component (name = "MyProvider", immediate = true)
public class TestClass implements SimpleMathI {

public TestClass() {
System.out.println("contructing TestClass");
}

@Activate
protected void activate(ComponentContext c, BundleContext b) {
System.out.println("activate testClass ");
}

@Deactivate
protected void deactivate() {
System.out.println("de-activate testClass");
}

@Override
public void doSimpleAdd(int x, int y) {
System.out.println("Result(TestClass): " + (x + y));
}

@Override
public void doSimpleSubstract(int x, int y) {
System.out.println("Result(TestClass): " + (x - y));
}
}

它注册组件 MyProvider 和服务 test.SimpleMathI ( listed in karaf )

这是消费者:

如果我不引用服务 SimpleMathI,而仅引用 ConfigurationAdmin,则它可以正常工作!

package test;

import org.osgi.framework.BundleContext;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.ConfigurationPolicy;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;

@Component (name = "MyConsumer", immediate = true, configurationPolicy = ConfigurationPolicy.OPTIONAL)
public class TestClass2 {

public TestClass2() {
System.out.println("contructing TestClass2");
}

@Reference (bind = "bind", unbind = "unbind")
ConfigurationAdmin cm; // works

@Reference (bind = "bindSimpleMathI", unbind = "unbindSimpleMathI")
SimpleMathI simpleMath; // does not work, see screenshot

@Activate
protected void activate(ComponentContext c, BundleContext b) {
System.out.println("activate testClass2");
// simpleMath.doSimpleAdd(20, 25);
}

@Deactivate
protected void deactivate() {
System.out.println("de-activate testClass2");
}

protected void bind(ConfigurationAdmin a) {
System.out.println("binding");
}

protected void unbind(ConfigurationAdmin a) {
System.out.println("un-binding");
}

protected void bindSimpleMathI(SimpleMathI a) {
System.out.println("binding!!");
}

protected void unbindSimpleMathI(SimpleMathI a) {
System.out.println("un-binding!!");
}
}

这是 Karaf webconsole 中的输出.

我用谷歌搜索了足够多的内容,但仍然无法弄清楚我错过了什么。奇怪的是,因为代码非常简单且透明。那么,我实现了错误的提供者或消费者?

Karaf 4.0.7,未使用 Apache felix,纯 OSGi R6 声明式服务

最佳答案

我认为你犯了一个简单的错误。在 OSGi 中,您不应该有两个具有相同包的 bundle 。

OSGi 中的典型设置是包含三个包:

  • 接口(interface)的test.api
  • 服务实现的 test.impl 或 test.provider
  • 您的消费者类别的 some.other.package

您可以将 test.api 和 test.impl 放在同一个包中,也可以使用单独的 api 包。

在任何情况下,消费者都不应该将接口(interface)包嵌入到自己的包中。相反,它应该在 api 包的 list 中包含一个 Import-Package。

关于java - 对 Karaf 的服务状态不满意(引用) - 错误在哪里? (OSGi、声明式服务、注释),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40045501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com