我刚开始使用OSGI开发,并且正在努力了解如何最好地处理依赖JAR。
即。如果我正在创建一个捆绑包,我可能需要使用一些第三方JAR。当我创建我的捆绑JAR以部署到OSGI时,显然这些第三方JAR不包括在内,因此捆绑包不会运行。
我知道一个选项是将这些JAR转换为捆绑包,并将它们部署到OSGI容器中。但是,如果它们只需要被一个捆绑使用,那么这似乎并不理想。
最佳解决方案是什么? JAR是否可以嵌入到捆绑JAR中,如果是这样,这是一种合理的方法吗?
答案 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的帮助下做到这一点。