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

Java OSGI-处理捆绑包所需的第三方JAR,java,jar,osgi,Java,Jar,Osgi,我刚刚开始OSGI开发,正在努力理解如何最好地处理依赖JAR i、 e.如果我正在创建一个捆绑包,很可能我需要使用一些第三方罐子。当我创建要部署到OSGI的包JAR时,显然不包括这些第三方JAR,因此包不会运行 我知道一种选择是将这些JAR转换成捆绑包,并将它们部署到OSGI容器中。然而,如果它们只需要由一个包使用,这似乎并不理想 解决这个问题的最佳方案是什么?JAR是否可以嵌入到bundle JAR中?如果是这样,这是一种合理的方法吗?我几乎总是分别绑定每个JAR。OSGi本身就是为了模块化而

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

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

我知道一种选择是将这些JAR转换成捆绑包,并将它们部署到OSGI容器中。然而,如果它们只需要由一个包使用,这似乎并不理想


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

我几乎总是分别绑定每个JAR。OSGi本身就是为了模块化而设计的,如果不这样做的话,你会觉得整个系统都很荒谬


如果要将JAR转换为捆绑包,可能需要使用。但是首先,如果他们还没有为您完成工作,我建议您在中查找bundle。

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

一种简单的方法是使用Maven来管理依赖项并构建捆绑包。查看插件文档页面部分中描述的Maven Bundle插件的
说明


正如罗兰所指出的,就OSGi的意图而言,这不是一个理想的解决方案,即模块化和重用单个模块。但是,在第三方依赖项可以转换为OSGi捆绑包之前,这可能是一个实用的解决方案。

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

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

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

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

这里是一个例子,如果您正在使用

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


!org.apache.jackrabbit.test,
*
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
.,
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

我们是否可以使用OSGI覆盖在运行时加载的引导类加载器JAR,比如如果我们想将Java7中可用的JAXP1.4.5覆盖到JAXP1.6,那么有-Dendorese特性可以将默认API覆盖到升级的API。我们能在OSGI的帮助下做这件事吗。

我想我会添加这个答案,因为这是我在web上找到的一个解决方案,并且能够很快开始工作。但是,我很欣赏关于将JAR正确部署为Bundle的优势的观点。在类路径分隔符中应该使用逗号而不是分号。请记住,如果Bundle类路径中的一个对象在另一个Bundle中使用,并且该Bundle声明了自己的Bundle类路径,那么这可能会导致ClassCastExceptionclassloader将有所不同我认为这是一个很好的折衷方案,当您想要扩展一个基于遗留服务的包,并且它依赖于有限的一组专有JAR文件时。请避免这种模式。每个罐子都应该有自己的包。OSGi是模块化系统。这是关于可伸缩性的。如果您正在寻找主流开源库,我希望Spring的人能从他们的存储库中获得它。你也应该避免嵌入,因为它有时会导致奇怪的行为。今天,你需要的很多LBI已经是捆绑包了,所以首先要找我的是maven central repo。如果lib的主要发行版还不是一个bundle,那么查看central中的servicemix bundle也是有意义的。这是一个问题还是一个答案?这似乎是另一个问题——在这种情况下,你应该把它作为一个单独的问题而不是一个答案发布。
    <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>