OSGI - 处理捆绑包所需的第三方JAR

时间:2009-08-27 11:29:28

标签: java jar osgi

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

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

我知道一个选项是将这些JAR转换为捆绑包,并将它们部署到OSGI容器中。但是,如果它们只需要被一个捆绑使用,那么这似乎并不理想。

最佳解决方案是什么? JAR是否可以嵌入到捆绑JAR中,如果是这样,这是一种合理的方法吗?

6 个答案:

答案 0 :(得分:40)

您可以在包中包含第三方jar,方法是将第三方jar添加到bundle jar文件的根目录,然后将bundle classpath标头添加到bundle的清单中,例如:

Bundle-ClassPath: .,my3rdparty.jar

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

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

答案 1 :(得分:27)

我几乎总是将每个罐子分开包装。 OSGi本身就是用于模块化的,你不会因为不这样做而使整个系统变得荒谬。

如果要将JAR转换为捆绑包,可能需要使用BND Tool written by Peter Kriens。但首先我建议你在SpringSource Enterprise Bundle Repository中查找捆绑包,如果他们还没有完成你的工作。

答案 2 :(得分:9)

可以将非OSGi依赖项嵌入到bundle中。

一种简单的方法是使用Maven来管理您的依赖项,并使用Maven Bundle Plugin来构建您的bundle。请查看插件文档页面Embedding dependencies部分中描述的Maven Bundle插件的<Embed-Dependency><Embed-Transitive>说明。

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

答案 3 :(得分:6)

这个线程有点旧,但我想指出嵌入依赖项的一个局限性。回想一下,依赖关系是在jar级别,但是当你导出包时,一些可能需要来自嵌入式依赖。如果发生这种情况,您将最终得到重复的类,一个在顶级包中内联,另一个在嵌入式jar中。当然,您可以内联整个嵌入式jar,但在您知道之前,它会在整个依赖关系链中传播。这只是Roland和其他人提到的问题之一。

答案 4 :(得分:4)

以下是使用Maven Bundle Plugin的示例。

注意:此插件会自动导入您的依赖项所需的包。这对您来说可能是也可能不是问题。值得庆幸的是,您可以取消您真正需要导入的软件包(见下文)。

    <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>

答案 5 :(得分:-4)

我们可以使用OSGI来覆盖运行时加载的引导类加载器jar,就像我们想要将Java7中可用的JAXP1.4.5重写为JAXP1.6一样,还有-Dendorese功能可以覆盖升级API的默认API。我们能否在OSGI的帮助下做到这一点。