1

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

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

现在,我想在 OSGI 包中使用这个框架 A.jar。我为 A.jar 生成了 Manifest 文件,正确添加了导入和导出。

导入和导出不起作用,因为我正在使用反射加载类,所以我使用了 DynamicImport-Package。

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

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

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

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

4

2 回答 2

3

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”,您会看到许多有用的解释为什么不应该使用它们。

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

阅读这些文章后,您对如何设计基于 OSGi 的解决方案有了更好的了解。

于 2014-09-06T18:44:55.880 回答
1

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

于 2014-09-04T10:49:33.257 回答