捆绑OSGi依赖库的标准方法是什么?

时间:2010-06-10 10:36:10

标签: java plugins osgi packaging

我有一个项目引用了许多开源库,一些是新的,一些不是那么新。也就是说,它们都很稳定,我希望坚持使用我选择的版本,直到我有时间迁移到更新的版本(我昨天测试了hsqldb 2.0,它包含许多api更改)。

我希望嵌入的其中一个库是Jasper Reports,但是你们肯定知道,它带有一大堆支持jar文件,我只需要一个山的子集(已知),因此我打算自定义捆绑所有依赖库。

所以:

  • 是否每个人都为他们正在使用的开源库定制自己的OSGi包,或者是OSGi版公共库的主要来源吗?

  • 此外,我认为我的每个捆绑包只是简单地将其依赖的jar嵌入到捆绑包本身中会更简单。这可能吗?如果我选择在一个包中嵌入第三方foc库,我假设我需要生成2个jar文件,一个没有嵌入式库(用于通过类路径通过标准类加载器加载的库),以及一个包含的osgi版本因此,我应该选择像这样的捆绑名称<< myprojectname>> - << subproject>> -osgi-.1.0.0.jar?

  • 如果我无法嵌入开源库并选择自定义捆绑开源库(通过bnd),我应该选择一个唯一的捆绑名称以避免与可能的官方捆绑包冲突吗?例如<< myprojectname>> - <<< 3rdpartylibname>> - <<< 3rdpartylibversion>> .jar?

  • 我的非OSGi项目目前通过Service.providers(...)扫描各种插件罐中的META-INF文件夹,扫描自定义插件。如果我去OSGi,这个机制还能运作吗?

6 个答案:

答案 0 :(得分:7)

我更喜欢不嵌入依赖的罐子(是的,这是可能的)。它会导致两个问题,

1)没有重复使用此代码。许多捆绑包可能只是做同样的事情(嵌入相同的jar),你最终安装了多次相同的jar。您可以争辩说,您的软件包也可以导出嵌入式jar的接口,但这很难看,因为它不应该是您的捆绑责任来公开该代码。它还使得公开多个版本的库或同一版本的多个提供者更容易。

2)这是特定于Eclipse的 - 嵌入式jar在开发环境中无法正确解析(仍在运行时工作)。我的捆绑包可能依赖于我的目标平台中的捆绑包,它将无法解析嵌入式jar中的元素,必须将它们导入工作区才能工作。

我发现大多数开源罐已经很好bundled by the nice folks at Spring。还有其他的回购,但不幸的是我丢失了他们的链接。

答案 1 :(得分:2)

也许您正在寻找像Maven这样的东西?不知道如何使用OSGi。您可以在这里找到有关Maven的Jasper Reports的一些信息: http://mvnrepository.com/artifact/jasperreports/jasperreports

答案 2 :(得分:2)

Eclipse Orbit项目还制作了许多常用的第三方罐子。

http://www.eclipse.org/orbit/

答案 3 :(得分:1)

具体说明您提出的问题。

每个人都不会自己创造。请参阅我之前的回答,获取第三方库的Eclipse包装链接作为捆绑包。如果您找不到已打包的版本,则必须自行创建。

最好将二进制依赖项包装在自己的bundle中,而不是将jar作为二进制文件包含在代码包中。选择你想要的任何包名称,它包的导入和导出是重要的。使用项目名称命名包名称将确保您不会遇到冲突。

访问捆绑存储区域进行扫描并非不可能,但它往往需要有关如何/在何处提取捆绑包的OSGi运行时特定信息。所以这是可能的,但并不容易。

答案 4 :(得分:1)

spring创建了大多数开源库的osgi包,我在那里看到了jasper报告。查看他们的捆绑存储库@ http://www.springsource.com/repository/app/bundle

答案 5 :(得分:0)

我们一直在使用Maven和OSGI,我们在它的pom.xml中声明了bundle依赖项,你不必再担心它们了。