2014-09-04 58 views
0

我编写了一个框架(让我们调用A),它依赖于jdbc驱动程序&数据源并使用反射来加载类。OSGI捆绑包,用于从属罐的反射

它采用3 Thread.currentThread参数化的Class.forName()。getContextClassLoader()

现在,我想用这个框架a.jar文件的一个OSGi包内。 我为A.jar生成了Manifest文件,正确添加了导入&导出。

进口&导出不起作用,因为我使用反射来加载类,所以我使用了DynamicImport-Package。

但是,它如果我包括使用a.jar文件的包内DynamicImport-软件只, 它不工作,如果我包括内a.jar文件

DynamicImport-包我不能有每个使用A.jar来更改清单文件并包含DynamicImport的bundle。

你能帮我解决这个问题吗?

PS:我不能改变静态加载类。我通过省略某些细节简化了问题,例如A.jar实际使用Oracle UCP,它使用反射来加载数据源。

回答

2

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

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

你设法使用他们三个:)。

OSGi基于服务。服务基于接口(或有时是类)。试着想一边注册一个OSGi服务,然后在另一边使用这个服务!尝试定义一个API来帮助您避免这些模式!

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

尝试寻找“Class.forname OSGi”和“thread.getContextClassLoader OSGi”在谷歌,你会看到许多有用的explonations为什么他们不应该使用。

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

在阅读这些文章,你有一个更好的画面,如何设计基于OSGi的解决方案。

1

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