【问题标题】:OSGi Felix and BndTools - Load class by nameOSGi Felix 和 BndTools - 按名称加载类
【发布时间】:2012-03-23 08:13:00
【问题描述】:

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

【问题讨论】:

  • 如果您的源代码中有类名,则永远不需要使用 Class.forName 加载类动态。仅当您通过运行时机制获取类名时,才应使用动态类加载。

标签: java osgi classloader apache-felix bnd


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-20
      • 2018-09-22
      • 2014-05-22
      • 2018-05-14
      • 2014-11-17
      • 2016-03-26
      • 2011-12-11
      • 2011-02-13
      相关资源
      最近更新 更多