OSGi Felix和BndTools - 按名称加载类

时间:2012-03-05 20:45:09

标签: java osgi classloader apache-felix bnd

在我的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包装程序包提供。

2 个答案:

答案 0 :(得分:4)

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

因此,对于您的第一个工作方法,您必须将包com.mysql.jdbc的依赖项添加到包的OSGi import语句中。如何实现这一点是特定于工具的,Bnd使用Import-Statement配置参数。

答案 1 :(得分:3)

@Heri在答案中说的一切都是正确的。但是,如果您想为此系统引入更多灵活性,使用OSGi服务

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

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