如何使用OSGI打包和使用现有Java库

时间:2010-01-25 01:23:57

标签: java osgi legacy

在寻求帮助来管理Java中相同库的不同版本的依赖关系之后,有人建议我应该看看OSGI实现。 在最后期限的压力下,我真的可以使用一些帮助来帮助我从无休止的OSGI文档中挖掘出来。 我有一个工作的应用程序,它将使用一个新的框架。框架使用我已经使用的不同版本的jar,所以我想将新框架打包为OSGI包。 我可以保留我的应用程序,并将OSGI包仅用作JVM中的容器吗?这意味着我将仅使用OSGI包来从JVM的其余部分中隔离一组类,以避免不同版本的类之间发生冲突。换句话说,我想使用OSGI而不将我的所有代码都带到基于OSGI的设置。

亲切的问候 谢雷夫

2 个答案:

答案 0 :(得分:3)

我在这里没有完整的答案,我只想反击什么威武说:

  

首先,您必须在OSGi框架中拥有整个应用程序。

事实并非如此。另一种方法是将OSGi容器嵌入到宿主应用程序中。

这里棘手的部分是OSGi内部与外部之间的交互,因为代码存在于不同的类加载器中。

您可以使用OSGi系统类路径使主机类对OSGi部件可见。 另一种方式更难。

主机代码与bundle交互的一种方式是主机应用程序和bundle(即主机的一部分)都可以看到的接口。 另一种方法是使用反射。

如果您在主机和OSGi之间有明确的分离,例如插件系统,那么这可以很好地工作。

  

处于截止日期的压力之下

这可能是个问题。 OSGi需要学习很多东西,因为它即将成为主流,但仍然缺乏社区知识,工具支持,库兼容性等等。

您应该问的最大问题是:我是否真的需要在运行时管理不同版本的依赖项?如果没有,即你可以在部署时解决问题(例如通过配置),那么可能有一个更简单的解决方案。

答案 1 :(得分:0)

首先,您必须在OSGi框架中拥有整个应用程序。但是,我认为设置它并不困难,因此您只需使用几个捆绑包(可能只有两个捆绑包,具体取决于您的设置。

我能看到的问题最少的路径是采用框架并将其及其所有依赖关系“包装”在一个包中。使依赖项的包成为私有。对于您的主项目,请执行相同的操作。

另一条路径是使用适当的wrap命令分别打包所有库。如果您对完整的OSGi不感兴趣,那么这会产生更多的潜在问题。

根据您的构建设置,我首先看看maven-bundle-plugin和/或Bnd。 maven-dependency插件使它变得非常简单,因为你所要做的就是告诉它嵌入哪些工件-id并且它会这样做。您需要确保将所有嵌入式jar包指定为私有包。

这应该有效,除非框架正在进行类加载/ AOP,这将使OSGify更加困难。

最后,如果您对快速非osgi 解决方案感兴趣,请使用maven-shade-plugin构建框架,并重命名冲突库的所有包。这可能是最简单的,因为您只需使用着色库重新打包一次框架,然后将其用作依赖项。