OSGI中的JDBC驱动程序问题
问题描述:
我试图让OSGI包使用Eclipse作为我的IDE(Windows 7 x64)访问MYSQL数据库。我能够加载jdbc连接器。实际的.jar被放在java安装目录的所有\ bin文件夹中,以及该软件包的\ bin文件夹中。我也将环境类路径变量设置为该文件夹。我有一个错误,指出该驱动程序不适合。我知道OSGI有一些与司机等问题。有人可以推荐一种方法来绕过这个?OSGI中的JDBC驱动程序问题
ClassLoader DBHCL = ClassLoader.getSystemClassLoader();
DBHCL.loadClass("com.mysql.jdbc.Driver");
Class.forName("com.mysql.jdbc.Driver", true, DBHCL).newInstance();
System.out.println("Class Loaded");
//DriverManager.getDriver("jdbc:mysql://localhost/timedb");
//System.out.println("Driver Gotten");
conn = DriverManager.getConnection(URL + DBName,username,password);
System.out.println("Connection Created");
stmt = conn.createStatement();
System.out.println("Statement Created");
connFlag = true;
控制台输出,错误:OSGi的>开始7数据基础服务(MYSQL)原类加载找到JDBC没有合适的驱动程序:MySQL的://本地主机/ timedb异常在线程 “线程1” INSERT INTO appliance1 ...
有没有人有任何洞察到这个问题?
我已经尝试单独为jdbc驱动程序创建一个单独的包并将其导出/导入到相应的包,但没有运气。
感谢
答
在您的代码段,你得到的SystemClassLoader
了,你问它的"com.mysql.jdbc.Driver"
。鉴于该调用不会给你一个ClassNotFoundException
,我们可以得出结论,系统类加载器可以为你找到类;司机将注册到DriverManager
。
但是,您看不到与MySQL驱动程序相同的DriverManager
! MySQL驱动程序会从系统类加载器中看到一个,但是您的代码(conn = DriverManager. ...
)使用该包自己的类加载器中的一个。这是两个不同的类别,因此找不到合适的驱动程序。
我的解决办法是不使用SystemClassLoader
(你不应该做的OSGi无论如何,除非你知道自己在做什么),但使用bundle的类加载器。所以,我会
- 不把MySQL jar放在系统类路径上,但让OSGi做了很多努力。你可以把这个罐子放在一个包里,然后把罐子放在
Bundle-ClassPath
上。然后,您可以选择将其保留为您的包(如果您是唯一使用它的包),或者导出包。 - 代替使用系统类加载器,请使用该包的类加载器。这可以像使用
Class.forName("com.mysql.jdbc.Driver")
一样简单;这将做正确的事情。