<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>
6 回答
我几乎总是分开捆绑每个 jar . OSGi本身就是用于模块化的,你不会因为不这样做而使整个系统变得荒谬 .
如果要将JAR转换为包,可能需要使用BND Tool written by Peter Kriens . 但首先我建议你在SpringSource Enterprise Bundle Repository寻找捆绑包,如果他们还没有完成你的工作 .
您可以在包中包含第三方jar,方法是将第三方jar添加到bundle jar文件的根目录中,然后将bundle classpath标头添加到bundle的清单中,例如:
如果要将第三方jar放置到子目录,请指定路径而不使用 Headers ./ ,例如
可以将非OSGi依赖项嵌入到bundle中 .
一种简单的方法是使用Maven来管理您的依赖项,并使用Maven Bundle Plugin来构建您的bundle . 请查看插件文档页面的Embedding dependencies部分中描述的Maven Bundle插件的
<Embed-Dependency>
和<Embed-Transitive>
指令 .正如Roland所指出的,就OSGi的意图而言,这不是一个理想的解决方案,即单个模块的模块化和重用 . 然而,它可能是暂时的实用解决方案,直到第三方依赖项可以转换为OSGi包 .
这个线程有点旧,但我想指出嵌入依赖项的一个局限性 . 回想一下,依赖关系是在jar级别,但是当你导出包时,一些可能需要来自嵌入式依赖 . 如果发生这种情况,您将最终得到重复的类,一个在顶级包中内联,另一个在嵌入式jar中 . 当然,您可以内联整个嵌入式jar,但在您知道它之前,它会在整个依赖关系链中传播 . 这只是Roland和其他人提到的问题之一 .
如果您使用Maven Bundle Plugin,这是一个示例 .
注意:此插件会自动导入依赖项所需的包 . 这对您来说可能是也可能不是问题 . 值得庆幸的是,您可以取消不需要导入的软件包(参见下文) .
我们是否可以使用OSGI来覆盖运行时加载的引导类加载器jar,就像我们想要将Java7中可用的JAXP1.4.5重写为JAXP1.6一样,还有-Dendorese功能可以覆盖升级API的默认API . 我们能否在OSGI的帮助下做到这一点 .