OSGi Felix 和 BndTools - 按名称加载类

Posted

技术标签:

【中文标题】OSGi Felix 和 BndTools - 按名称加载类【英文标题】:OSGi Felix and BndTools - Load class by name 【发布时间】: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 加载类动态。仅当您通过运行时机制获取类名时,才应使用动态类加载。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于OSGi Felix 和 BndTools - 按名称加载类的主要内容,如果未能解决你的问题,请参考以下文章

使用 Maven、OSGi 和 Bndtools

如何在 apache felix 上实现异步处理?

如何使用 bndtools 通过 Scala 创建 OSGi 包?

OSGi 子系统可以替代 Eclipse 功能吗?

BndTools,如何添加非 OSGi JAR?

Liferay7 BPM门户开发之38: OSGi Bndtools开发入门