【问题标题】:OSGi service class dependenciesOSGi 服务类依赖项
【发布时间】:2013-03-05 18:58:43
【问题描述】:

我想知道什么是组织我的包的好方法,以便可以在它们之间共享作为服务参数所需的类。

我有几个服务接口,它们暴露了需要在bundes之间引用的类类型,例如:

public interface DoesThis {
   public CustomClassB doSomething(CustomClassA customClassA);
}

据我了解,CustomClassA(如果与公开的服务在同一个包中定义)对其他包不可用,所以最好在一个包中公开包之间的类引用,然后导出?

作为一个子问题:服务和包导出是否应该协同工作...从我正在阅读的文档中不清楚是否是这种情况?

谢谢

【问题讨论】:

  • 您能否修复您的代码示例以明确您的要求?这不是有效的 Java。
  • @Neil Bartlett 已修复!

标签: java osgi apache-felix


【解决方案1】:

基本上,是的。接口引用的所有类型都必须在导出的包中。有几个选项:

  • 它们可能与接口在同一个包中,在这种情况下,它们自然会与接口同时导出,因为在 OSGi 中,我们总是导出/导入整个包。
  • 它们可能位于不同的包中,但由与服务接口相同的包导出。
  • 它们可能位于不同的包中并由不同的捆绑包导出。在这种情况下,服务接口包必须导入该包。

如果您考虑一下,不导出类型是没有意义的。例如,如果消费者无法创建 CustomClassA 类型的对象来传递,或者无法理解返回类型 CustomClassB,消费者如何调用您的 doSomething 方法?

关于您的子问题...是的,包导出的存在主要是为了支持服务注册表。只有提供者和消费者能够就服务的“合同”达成一致,服务才能工作,这在 Java 术语中意味着它们加载相同的接口。

【讨论】:

  • 感谢您的回答...我想这是我所期望的。作为后续行动,为了在另一个包中引用服务,我是否会在我的包上创建一个编译时依赖项(我正在使用 Maven)来公开服务? (即,如果它在另一个包中,我如何引用服务类?)。我知道上下文将允许我掌握具体的实现,但是我需要对接口/服务的引用才能编译我的第二个包!再次感谢
  • 不,你导入包含接口的包。服务的全部意义在于将您与特定的实现类解耦,因此您只依赖于接口。为了获得服务对象,使用声明式服务最容易做到这一点。例如尝试Bndtools tutorial
  • 再次感谢...我了解接口概念,我正在努力寻找解决构建时间依赖性的方法,因为我正在使用似乎不像 Eclipse 那样成熟的 Netbeans对于 OSGi。我发现在 Netbeans 中执行此操作的唯一方法是添加一个项目依赖项,我认为这将允许我引用整个项目中不应该发生的任何类(如果 Netbeans 支持 OSGi)。就目前而言,它必须这样做,因为我必须将 Netbeans 用作公司政策的一部分!
  • 我认为仍然可以实现:您可以在一个项目中拥有接口,而在另一个项目中的实现依赖于第一个。无论如何,您对您的公司强迫您使用劣质 IDE 表示同情……我不明白为什么公司坚持故意破坏其开发人员生产力的政策!
猜你喜欢
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2017-09-12
  • 2014-04-14
  • 2023-03-12
相关资源
最近更新 更多