我正在寻找可以在其他项目中使用的Java'库'(JAR),但我希望我的库可以扩展。我正在寻找一些OSGi-esque,我的库有“扩展点”,其他JAR可以挂钩。我的想法是我的库将有一组核心方法,这些方法将被它所使用的项目调用,但这些方法的确切实现可能会因项目/上下文而异。
我已经研究过OSGi(例如Equinox),但我不确定它是否可以按照我的方式使用。它似乎是针对独立应用而不是创建库。
实现这一目标的最佳方法是什么?是否可以通过这种方式使用OSGi,如果没有,那么就会有框架吗?
我希望一切都清楚 - 我清楚地知道自己想要什么,但很难明确表达。
答案 0 :(得分:2)
OSGi很棒,但我认为这不是你所需要的。通过使用OSGi(-Services),您也可以强制库的用户使用OSGi环境。
我认为正如@Peter所说,你可以通过在特定项目/上下文中扩展库的类来实现这一点。
但是如果你想使用OSGi,有一种简单的方法可以实现这一点。它被称为Bundle Fragments。通过这种方式,您可以创建一个包并扩展所谓的Host-Bundle“,即您的库,而无需更改原始库。一个流行的用例是,如果您的包中有特定于平台的代码。
答案 1 :(得分:1)
在OSGi上下文中,命名Java库的名称为“Bundle”。
OSGi Bundle是一个JAR文件,其MANIFEST.MF文件中包含一些特殊的元信息。现在,每个OSGi Bundle都有Exported-Packages或Imported-Packages。
通过Export-Packages Manifest标头,您可以显示您要导出的所有包。而您的其他项目只需将要使用的包添加到其Import-Packages中即可。 这是一个例子: -
捆绑一个清单: -
Export-Packages: com.demo.exported;
Bundle B Manifest: -
Import-Packages: com.demo.exported;version=(1.0.0, 2.0.0]
这样你的bundle B(一个不同的项目)可以调用从Bundle A导入的包中的类的方法。 现在,您在import-package中看到的版本只是为了显示它可以接受的所有包版本。您可以拥有2个包含两个不同的实现某些接口的捆绑包,并提供两个不同版本的此包。两者都将是可用..
直到现在,我在谈论静态数据类型..
您还可以通过声明式服务动态公开您的服务。在这种情况下,您必须定义一个XML文件(组件定义),您可以在其中显示Bundle将公开的所有服务。在另一个包中,您可以再次定义另一个XML,以显示它需要的所有服务。 这些被称为提供服务和参考服务..
我认为这会让你对可以做些什么有所了解。 如果我在解释你的问题时出错了,请指明相同的..
*注意: - 当然OSGi用于创建独立的Bundles,可以在其他项目中重复使用..它们为您的项目带来了Modularity ..
答案 2 :(得分:0)
正如其他人所提到的,您不需要OSGi或任何框架。你可以使用template method pattern或strategy pattern这样的雇佣模式。动态修改/扩展功能还有其他几种模式,但这些模式似乎最适合您的描述。它们不需要任何框架。
从OSGi这样的框架中获得的好处是它可以为您管理布线。通常,你必须编写一些将你的库和扩展粘合在一起的代码 - 使用类似OSGi的框架,这将不会以最小的开销实现自动化(在OSGi的情况下,开销是JAR-manifest中的一些条目)