我刚开始接触OSGI发展,我在努力了解如何最好地处理相关的JAR。
也就是说,如果我创建一个包的情形产生的是,我将需要使用一些第三方的JAR文件。 当我创建我的包JAR部署到OSGI,显然这些第三方JAR文件不包括在内,因此包将无法运行。
据我所知,一个选择是把这些JAR成束,并将它们部署到OSGi容器。 但是,如果他们只需要通过一个包可以使用这似乎并不理想。
什么是对此最好的解决方案? 可以在JAR文件被嵌入捆绑JAR中如果是这样,这是一个合理的做法?
我刚开始接触OSGI发展,我在努力了解如何最好地处理相关的JAR。
也就是说,如果我创建一个包的情形产生的是,我将需要使用一些第三方的JAR文件。 当我创建我的包JAR部署到OSGI,显然这些第三方JAR文件不包括在内,因此包将无法运行。
据我所知,一个选择是把这些JAR成束,并将它们部署到OSGi容器。 但是,如果他们只需要通过一个包可以使用这似乎并不理想。
什么是对此最好的解决方案? 可以在JAR文件被嵌入捆绑JAR中如果是这样,这是一个合理的做法?
我几乎总是分开捆绑每个罐子。 OSGi的本身是为模块化,您不这样做,把整个系统归谬法。
如果你想JAR文件转换成捆你可能想使用由彼得柯瑞恩斯书面BND工具 。 但首先,我建议你看看在捆绑SpringSource的企业捆绑库 ,如果他们还没有为你做过的工作。
您可以通过添加第三方罐子捆jar文件的根目录,然后添加一个包类路径头的包的清单,如包括你的包内第三方的jar:
Bundle-ClassPath: .,my3rdparty.jar
如果您想将第三方坛子的子目录,指定路径,而不使用标题./,如
Bundle-ClassPath: .,lib/my3rdparty.jar # (not ./lib/my3rdparty.jar)
有可能嵌入非OSGi的依赖关系成束。
一个简单的方法做,这是使用Maven来管理你的依赖和Maven的捆绑插件来建立你的包。 看一看在<Embed-Dependency>
和<Embed-Transitive>
Maven的捆绑插件的指令的部分中所述嵌入的依赖关系的插件文档页面。
罗兰指出,这不是相对于一个理想的解决方案的OSGi的意图,即,模块化和各个模块的重用。 然而,它可能是暂时直到第三方的依赖关系可以转化为OSGi包务实的解决方案。
这个线程是有点老了,但我想指出嵌入依赖的限制之一。 回想一下,依赖关系是在罐子的水平,但是当你导出包有些人可能需要来自嵌入的依赖关系。 如果发生这种情况,你会出现重复的课程,在顶层包一个内联和其他嵌入式罐子。 当然,你可以内联整个嵌入式罐子,但是你要知道在此之前传播跨越整个依赖链。 这仅仅是罗兰等人指的是问题之一。
这是,如果你使用的是一个例子的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覆盖在运行时加载的类加载器引导坛子里一样,如果我们想要覆盖可提供Java7到JAXP1.6 JAXP1.4.5,有-Dendorese功能覆盖默认的API来升级API。 我们能做到这件事情与OSGI的帮助。