Service OSGI捆绑服务消费者是否需要创建;存根“;服务接口的定义?

Service OSGI捆绑服务消费者是否需要创建;存根“;服务接口的定义?,service,osgi,bundle,stub,consumer,Service,Osgi,Bundle,Stub,Consumer,我刚刚接触了OSGI技术,我有一些基本的疑问。 以下是我所做的: 在名为“com.mypackage.osgi.bundle.service”的包中创建了HelloWorld接口。这个接口公开了一个方法:publicstringsayhello(stringarg) 在名为“com.mypackage.osgi.bundle.service.impl”的包中创建了HelloWorldImpl类。此类实现HelloWorld接口,并为sayHello()方法提供实现 在名为“com.mypacka

我刚刚接触了OSGI技术,我有一些基本的疑问。 以下是我所做的:

在名为“com.mypackage.osgi.bundle.service”的包中创建了HelloWorld接口。这个接口公开了一个方法:publicstringsayhello(stringarg)

在名为“com.mypackage.osgi.bundle.service.impl”的包中创建了HelloWorldImpl类。此类实现HelloWorld接口,并为sayHello()方法提供实现

在名为“com.mypackage.osgi.bundle.activator”的包中创建了HelloWorldActivator类。此类实现BundleActivator接口,并实现接口的start()和stop()方法

在start()方法中,我通过“BundleContext”将此捆绑包注册为服务。代码如下所示:

公共类HelloWorldActivator实现BundleActivator{

ServiceRegistration helloServiceRegistration;

public void start(BundleContext context) throws Exception {

    HelloWorld helloService = new HelloWorldImpl();
    helloServiceRegistration =context.registerService(HelloWorld.class.getName(), helloService, null);    System.out.println("Service registered");    }

public void stop(BundleContext context) throws Exception {

    helloServiceRegistration.unregister();    System.out.println("Service un-registered");
} }
然后,我使用maven插件将此项目打包为一个OSGI捆绑包,并将其部署到OSGI容器(Equinox)上。在说明中,我将接口公开为导出包。我可以看到我的OSGI捆绑包已成功部署为OSGI容器上的服务(捆绑包id表示活动状态,我还可以看到osgi控制台上的“服务注册”输出)

现在,我的下一步是将上述OSGI捆绑包作为服务使用。 我理解为了做到这一点,我可以使用“ServiceReference”

假设我现在正在创建一个全新的java项目(因此该项目的工作区中没有与上面创建的项目的链接),这样它将充当上面创建的服务的使用者

我的问题是-我需要在这个新的java项目中创建HelloWorld接口的“副本”吗?换句话说,我需要在这个新项目的工作区中将这个接口作为“存根”使用

我问这个问题的原因是,如果我在新项目的工作区中没有“HelloWorld”接口的副本,我将在下面提到的第2行和第3行出现编译错误

公共类ConsumerActivator实现BundleActivator{

ServiceReference helloServiceReference;

public void start(BundleContext context) throws Exception {

    helloServiceReference= context.getServiceReference(HelloWorld.class.getName()); //2
    HelloWorld helloService =(HelloWorld)context.getService(helloServiceReference); //3
    System.out.println(helloService.sayHello("Test user"));

}
public void stop(BundleContext context) throws Exception {

    context.ungetService(helloServiceReference);
} }
那么,说消费者捆绑包应该有它打算使用的服务接口的“存根”是正确的吗

很抱歉,如果这听起来是一个非常基本的问题,但我需要澄清一下,因为我在网上找不到任何地方提到它。提供的所有示例都假设消费者和服务都是同一代码工作区的一部分

非常感谢您提前澄清

致意
LB

不,最好将包含接口的单独捆绑包作为API捆绑包的一部分。因此,您可以将接口与实际的服务提供商分开。但是,在您的情况下,这种方法太过分了,我会将HelloWorld接口与其(服务)合并在同一个捆绑包中实现。

不,最好有一个单独的捆绑包,其中包含作为API捆绑包一部分的接口。因此,您可以将接口与实际的服务提供商分开。但是,在您的情况下,这种方法太过分了,我会将HelloWorld接口及其(服务)合并在同一个捆绑包中实现。

不,只需在两个项目之间创建一个依赖项


另外,如果你刚开始使用OSGi,你真的不应该使用低级OSGi API。这就像在你还没有学会如何编写shell脚本之前就尝试破解Linux内核一样!请从声明性服务开始…请参阅这里的教程:

不,只是在两个项目之间创建一个依赖关系


另外,如果你刚开始使用OSGi,你真的不应该使用低级OSGi API。这就像在你还没有学会如何编写shell脚本之前就尝试破解Linux内核一样!请从声明性服务开始…请参阅这里的教程:

谢谢Neil,但我可能还不太清楚我的疑问到底是什么。我想提出的一点是-消费者是否需要了解服务提供商的接口?换句话说,有人说有一个名为“com.mypackage.osgi.bundle.service.HelloWorld”的服务注册"在OSGI环境中,任何人都可以使用它。现在,服务使用者是否能够通过知道服务的注册名称来使用此服务,或者需要将此服务接口作为存根放在其代码工作区中?服务使用者需要使用
导入包导入包含服务接口的包清单头。接口应该只有一个定义,提供者和使用者都将使用该定义。再次感谢您的响应。我同意OSGI容器需要被指示通过将服务接口导入服务使用者。但我的观点是,您仍然需要在nsumer的代码工作区,或者原始帖子中提到的代码片段中的第//2行和第//3行将给出编译错误。我同意可以创建项目依赖项,但只需从另一个角度考虑,使用者代码是在完全不知道提供者的代码库的另一台机器上创建的。使用者代码确实需要是的。如果API、提供者和使用者项目在同一个工作区中,那么您可以创建直接的项目间依赖关系。如果不是,那么您需要一种方法来共享已编译的API jar。例如,您可以使用存储库来实现这一点。这回答了我的问题。非常感谢!感谢Neil,但可能我还不太清楚我的问题n我的疑问是什么。我想提出的问题是-消费者是否需要了解服务提供商的接口?换句话说,有人说有一个名为“com.mypackage.osgi.bundle.service.HelloWorld”的服务注册在OSGI环境中,任何人都可以使用它。现在,服务消费者是否足够好,可以通过