首页 文章

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

提问于
浏览 801 次
37

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

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

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

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

6 回答

  • 9

    我几乎总是分开捆绑每个 jar . OSGi本身就是用于模块化的,你不会因为不这样做而使整个系统变得荒谬 .

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

  • -4

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

    Bundle-ClassPath: .,my3rdparty.jar
    

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

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

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

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

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

  • 4

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

  • 40

    如果您使用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>
    
  • 26

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

相关问题