OSGI – 处理捆绑软件所需的第三方JAR

我刚刚开始使用OSGI开发,并且正在努力理解如何最好地处理依赖JAR。

即如果我正在创build一个捆绑包,可能性是我需要使用一些第三方JAR。 当我创build我的捆绑JAR部署到OSGI,显然这些第三方JAR不包括在内,因此捆绑将不会运行。

我明白,有一个select是将这些JAR打包,并将它们部署到OSGI容器。 但是,如果他们只需要使用一捆,这似乎并不理想。

什么是最好的解决scheme? JAR是否可以embedded到捆绑JAR中?如果是的话,这是一个合理的方法吗?

我几乎总是分别捆绑每个jar子。 OSGi本身是模块化的意思,你不这样做,整个系统荒谬。

如果您想将JAR转换为捆绑包,您可能需要使用Peter Kriens编写的BND工具 。 但是首先我build议你在SpringSource Enterprise Bundle Repository中寻找这个bundle,如果他们还没有为你做这个工作的话。

通过将第三方jar添加到bundle jar文件的根目录,然后向bundle的清单中添加一个bundle classpath头,可以在你的bundle中包含第三方jar,例如:

Bundle-ClassPath: .,my3rdparty.jar 

如果要将第三方jar放置到子目录中,请指定不使用标题./的path,例如

 Bundle-ClassPath: .,lib/my3rdparty.jar # (not ./lib/my3rdparty.jar) 

可以将非OSGi依赖embedded到包中。

一个简单的方法是使用Maven来pipe理你的依赖和Maven Bundle Plugin来构build你的包。 查看插件文档页面的embedded依赖关系部分中介绍的Maven Bundle插件的<Embed-Dependency><Embed-Transitive>指令。

正如Roland所指出的那样,OSGi的意图不是一个理想的解决scheme,即单个模块的模块化和重用。 然而,这可能是暂时的解决scheme,直到第三方依赖可以被转换成OSGi包。

这个线程有点旧,但我想指出embedded依赖的局限性之一。 回想一下,依赖关系在jar级别,但是当你导出包的时候,一些可能需要来自embedded的依赖关系。 如果发生这种情况,最终会得到重复的类,一个嵌套在顶层包中,另一个embedded到jar中。 当然,你可以embedded整个embedded式jar,但是在你知道它之前,它会遍历整个依赖链。 这只是罗兰等人提到的其中一个问题。

这里是一个例子,如果你使用的Maven捆绑插件 。

注意:这个插件会自动导入你的依赖需要的包。 这对你来说可能也可能不是问题。 谢天谢地,你可以抑制你不需要导入的包(见下文)。

  <Import-Package> <!-- this was imported by one of the dependencies; I don't really need it --> !org.apache.jackrabbit.test, * </Import-Package> <Include-Resource> lib/concurrent-1.3.4.jar, lib/jackrabbit-core-2.6.5.jar, lib/jackrabbit-spi-2.6.5.jar, lib/jackrabbit-spi-commons-2.6.5.jar, lib/lucene-core-3.6.0.jar, lib/tika-core-1.3.jar </Include-Resource> <Bundle-ClassPath> ., concurrent-1.3.4.jar, jackrabbit-core-2.6.5.jar, jackrabbit-spi-2.6.5.jar, jackrabbit-spi-commons-2.6.5.jar, lucene-core-3.6.0.jar, tika-core-1.3.jar </Bundle-ClassPath> 

我们可以使用OSGI来覆盖在运行时加载的引导类加载器jar,就像我们想要覆盖Java7到JAXP1.6的JAXP1.4.5一样,还有-Dendoresefunction可以覆盖默认的API到升级后的API。 我们可以在OSGI的帮助下做到这一点吗?