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 - 按名称加载类的主要内容,如果未能解决你的问题,请参考以下文章