2012-03-05 58 views
3

在我的OSGi环境中,我试图预加载数据库驱动程序以供进一步使用。通常情况下,可以这样做:OSGi Felix和BndTools - 按名称加载类

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

+0

如果您的源代码中包含类名,则永远不需要使用Class.forName加载类动态类。只有通过运行时机制获取类名时,才应该使用动态类加载。 – 2012-03-06 07:47:41

回答

4

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

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

3

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

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

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