与依赖罐子的OSGI捆绑的反思

时间:2014-09-04 09:39:25

标签: java osgi osgi-bundle osgi-fragment

我写了一个框架(让我们称之为A),它取决于jdbc驱动程序&数据源并使用反射加载类。

它使用3个参数化的Class.Forname和Thread.currentThread()。getContextClassLoader()

现在,我想在OSGI包中使用这个框架A.jar。 我为A.jar生成了Manifest文件,添加了import&出口得当。

进口&导出无效,因为我使用反射加载类,所以我使用了DynamicImport-Package。

但是,只有在使用A.jar的Bundle中包含DynamicImport-Package时,它才有效。 如果我在A.jar

中包含DynamicImport-Package,它将不起作用

我不能让每个使用A.jar的包更改其清单文件并包含DynamicImport。

你能帮我解决这个问题。

PS:我无法更改为静态加载课程。我通过省略某些细节来简化问题,例如A.jar实际上使用Oracle UCP,它使用反射来加载数据源。

2 个答案:

答案 0 :(得分:2)

Class.forName(...)是OSGi中的反模式。永远不要使用它! Thread.currentThread()。getContextClassLoader()是OSGi中的第二个反模式。

在我看来,DynamicImport-Package也是一种反模式。它仅用于允许已发布的技术在OSGi中工作(我的意思是:尽可能多地工作,直到OSGi友好解决方案可用于同一问题)。

你设法使用了所有这三个:)。

OSGi基于服务。服务基于接口(或有时是类)。试着考虑在一侧注册OSGi服务并在另一侧使用该服务!尝试定义一个可以帮助您避免这些模式的API!

您希望使用JDBC驱动程序。您应该阅读OSGi概要规范的 125 JDBC服务规范章节。

尝试在google中查找“Class.forname OSGi”和“thread.getContextClassLoader OSGi”,您将看到许多有用的explonations,为什么不应该使用它们。

其中一个:http://wiki.osgi.org/wiki/Avoid_Classloader_Hacks

阅读完这些文章后,您可以更好地了解如何基于OSGi设计解决方案。

答案 1 :(得分:1)

为什么不在A.jar中包含ucp.jar并在A.jar中使用Bundle-ClassPath?