3

我希望创建一个可以在其他项目中使用的 Java“库”(JAR),但我希望我的库是可扩展的。我在追求一些 OSGi 风格的东西,我的库有其他 JAR 可以连接的“扩展点”。我的想法是我的库将具有一组核心方法,这些方法将由它所使用的项目调用,但这些方法的确切实现可能会因项目/上下文而异。

我已经研究过 OSGi(例如 Equinox),但我不确定它是否可以按照我想要的方式使用。它似乎面向独立应用程序,而不是创建库。

实现这一目标的最佳方法是什么?可以以这种方式使用 OSGi,如果不能,是否有框架可以做到这一点?

我希望一切都清楚——我对自己想要什么有一个清晰的想法,但很难说清楚。

4

3 回答 3

2

OSGi 很棒,但我认为这不是您所需要的。通过使用 OSGi(-Services),您也可以强制库的用户使用 OSGi 环境。

我认为正如@Peter 所说,您可以通过在特定项目/上下文中简单地扩展库的类来做到这一点。

但如果您想使用 OSGi,有一种简单的方法可以实现这一点。它被称为捆绑片段。通过这种方式,您可以创建一个包并扩展所谓的“主机包”,即您的库,而无需更改原始库。一个流行的用例是您的包中有特定于平台的代码。

于 2012-09-21T08:36:09.387 回答
1

您所命名的 Java 库在 OSGi 上下文中被命名为“Bundle”。

OSGi Bundle 是一个 JAR 文件,在其 MANIFEST.MF 文件中有一些特殊的元信息。现在,每个 OSGi Bundle 都有 Exported-Packages 或 Imported-Packages。

通过 Export-Packages Manifest 标头,您可以显示您正在导出的所有包。您的其他项目可以简单地将它想要使用的包从它们添加到其 Import-Packages.. 这是一个示例:-

捆绑清单:-

Export-Packages: com.demo.exported;

捆绑 B 清单:-

Import-Packages: com.demo.exported;version=(1.0.0, 2.0.0]

这样,您的包 B(一个不同的项目)可以调用从包 A 导入的包中的类中的方法。现在,您在导入包中看到的版本只是为了显示所有包版本可以接受..您可以拥有两个具有某些接口的两个不同实现的捆绑包,并以两个不同的版本提供此包..两者都将可用..

到现在为止,我在谈论静态数据类型..

您还可以通过声明式服务动态公开您的服务。在这种情况下,您必须定义一个 XML 文件(组件定义),在其中显示您的 Bundle 将公开的所有服务。在另一个包中,您可以再次定义另一个 XML,以显示它需要的所有服务。这些被称为提供的服务和引用的服务。

我认为这将使您对可以做什么有所了解。如果我在解释您的问题的某个地方有误,请指定相同的内容..

*注意:- 当然,OSGi 用于创建独立的捆绑包,可以在其他项目中重复使用。它们为您的项目带来模块化..

于 2012-09-20T16:20:16.433 回答
0

正如其他人所提到的,您不需要 OSGi 或任何框架。您可以使用模板方法模式策略模式等模式来执行此操作。还有其他几种动态修改/扩展功能的模式,但这些似乎最符合您的描述。它们不需要任何框架。

您从像 OSGi 这样的框架中获得的好处是它将为您管理布线。通常,您必须编写一些代码将您的库和扩展粘合在一起 - 使用像 OSGi 这样的框架,这不会以最小的开销自动完成(对于 OSGi,开销是 JAR 清单中的一些条目) .

于 2012-09-25T07:55:24.460 回答