java - 第 3 方库的一致 OSGi 导入

标签 java osgi

我一直在开发 OSGi 模块,但到目前为止,当我不得不包装现有的 jar 时,我遇到了很多问题。这方面的一个例子是使用 Oracle 数据库驱动程序,即使我将 jar 打包为包,它也只是拒绝工作(即使存在驱动程序类也找不到)。这只是一个示例,但我在使用其他第 3 方库时遇到了问题,想知道是否有使用每次都有效的第 3 方库的最佳实践方法?

最佳答案

您的问题是 jdbc 使用来自 java 运行时的类来查找数据库驱动程序 (DriverManager.getConnection)。这无法工作,因为无法从系统类加载器(加载 DriverManager 类)访问数据库驱动程序。

在 OSGi 中工作的一种方法是使用 DataSource 代替:http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html .您只需使用 new 创建数据源,这当然有效。问题是它使您的用户包依赖于特定的数据库驱动程序。所以最好的做法是集中创建数据源并将其发布为服务。

您可以在我的 Apache Karaf DB 教程 (http://www.liquid-reality.de/display/liquid/2012/01/13/Apache+Karaf+Tutorial+Part+6+-+Database+Access) 中找到更多详细信息。

顺便说一句。一般来说,这种工厂通常是 OSGi 中库失败的地方。每个库都发明了另一个不同的工厂系统,其中大部分与 OSGi 的受限类加载器不兼容。幸运的是,如今大多数库都已准备好 OSGi。大多数时候,这仅仅意味着您还可以使用可以使用 OSGi 服务检索的具体对象来调用工厂。

关于java - 第 3 方库的一致 OSGi 导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15623803/

相关文章:

java - 远程运行 map 查询失败。在节点上执行 map 查询失败

java - io.netty.handler.ssl.OpenSsl 使用 tomcat 类而不是自身

java - 带 ansi 输入的 Eclipse 控制台

MySQL、c3p0 和 Apache Felix 集成

osgi - 春分启动错误(控制台捆绑丢失)

java - 如何从二进制文件读取两种不同的列表类型

java - SOQL 查询字符串的正则表达式

java - 尝试从 Unity 4.6 中的 Java 插件设置纹理

java - 如何隐藏 OSGi 服务以使其他 bundle 无法找到它们?

java - Apache Felix OSGi Framework 中的自动更新包