3

在我的 OSGi 环境中,我正在尝试预加载数据库驱动程序以供进一步使用。通常,可以这样做:

Class.forName("com.mysql.jdbc.Driver");

之后,可以创建连接。但是,如果我在 Felix 下的 OSGi 中使用它,他说找不到类 ( ClassNotFoundException) 并且无法创建连接。但是当我做这样的事情时(try-catch被省略):

com.mysql.jdbc.Driver d = new com.mysql.jdbcDriver
Class.forName("com.mysql.jdbc.Driver");

然后一切正常并创建连接。但是,这不是很漂亮,因为无法交换驱动程序类。

有没有办法用第一种方法加载类?我假设我必须提供正确的类加载器。但我从哪里得到它?

MySQL 驱动程序作为 OSGi 包装器包提供。

4

2 回答 2

4

您究竟是如何创建捆绑清单的?如果您使用工具来自动解析包的 OSGi 导入语句,它们将在第一种方法上失败,因为它们无法将简单字符串识别为包依赖项。第二种方法将依赖表示为硬 Java 依赖,因此它被添加所需 OSGi 导入语句的工具识别(因此被 OSGi 运行时添加到包的类路径)。

因此,要使您的第一种方法起作用,您必须将包的依赖项添加到包com.mysql.jdbc的 OSGi 导入语句中。这是如何实现的取决于工具,Bnd 使用Import-Statement配置参数。

于 2012-03-05T21:12:32.217 回答
3

@Heri 在他的回答中所说的一切都是正确的。但是,如果您想在这个系统中引入更多的灵活性,请使用 OSGi 服务

您想建立数据库连接,但又不想将代码紧密耦合到特定的数据库或 JDBC 驱动程序。为什么不编写一个发布javax.sql.DataSource服务的小型 JDBC 包装器包呢?然后,您的逻辑捆绑包可以在它想要查询数据库时绑定到服务,并且它不需要了解有关物理数据库连接的任何信息。

请注意,JDBC 包装器捆绑包需要了解特定的 JDBC 驱动程序,但它会是一个非常薄的捆绑包,您可以为您可能希望使用的每个驱动程序生成替代包装器。

于 2012-03-06T00:58:19.187 回答