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

Wil*_*iam 40 java osgi jar

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

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

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

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

Wil*_*iam 41

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

Bundle-ClassPath: .,my3rdparty.jar
Run Code Online (Sandbox Code Playgroud)

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

Bundle-ClassPath: .,lib/my3rdparty.jar # (not ./lib/my3rdparty.jar)
Run Code Online (Sandbox Code Playgroud)

  • 请记住,如果Bundle-Classpath中的一个对象在另一个声明自己的Bundle-Classpath的bundle中使用,则可能会导致CLassCastExceptions,因为它们的类加载器会有所不同 (4认同)

Rol*_*der 27

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

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


Pav*_*hos 9

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

一个简单的方法是使用Maven来管理你的依赖项和Maven Bundle Plugin来构建你的bundle.请查看插件文档页面的嵌入依赖项部分中描述的Maven Bundle插件的说明<Embed-Dependency><Embed-Transitive>说明.

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


Ed *_*Ost 6

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