最近我一直在尝试向Hibern8IDE添加自定义类加载,以便它可以动态加载模型和数据库驱动类。
这使我们能够独立运行Hibern8IDE,而不是要求用户从他们的实际项目运行它(当然,这仍然可行;)
“技巧”如下
Thread thread = Thread.currentThread();
ClassLoader prevCl = thread.getContextClassLoader();
try {
List urls = ... // a list of paths/zips/jars for the classloader
if(urls.size()>0) {
URLClassLoader _newLoader = new URLClassLoader((URL[]) urls.toArray(new URL[0]), thread.getContextClassLoader());
thread.setContextClassLoader(_newLoader);
}
// convince DriverManager that you can use our specified driver!
String driverClass = props.getProperty("hibernate.connection.driver_class");
if(driverClass!=null) {
try {
Class driverClazz = ReflectHelper.classForName(driverClass);
DriverManager.registerDriver(new FakeDelegatingDriver((Driver) driverClazz.newInstance()));
} catch (... e1) {
}
}
configuration = new Configuration();
configuration = configuration.setProperties(props);
configuration = configuration.configure(configfile);
Iterator hbms = mappings.iterator();
while (hbms.hasNext()) {
hbm = (File) hbms.next();
configuration = configuration.addFile(hbm.toString());
}
initialize(); // build sessionfactory etc.
} catch (... e) {
} finally {
thread.setContextClassLoader(prevCl);
}
代码做了两件事:在加载映射和jdbc驱动时安装Hibern8IDE自定义类加载器,以及安装一个FakeDelegatingDriver来让java.sql.DriverManager相信它可以从系统类加载器之外的其他地方加载jdbc驱动。
这确实有效,但是在尝试通过Java Webstart启用Hibern8IDE时却失败了:)
尽管JNLP文件中有
模型类和驱动程序的加载工作顺利,但一旦驱动程序试图连接到数据库,就会抛出一个安全异常,表示应用程序不允许连接到数据库机器上的端口:)
因此,目前Hibern8IDE只提供独立版本,遗憾的是,由于Java Webstart的严格性,无法通过Java Webstart提供!
欢迎提出任何有创意的想法!